zoukankan      html  css  js  c++  java
  • day18 django基础

    一、django基础配置

    1、基本配置

      创建Django工程
        django-admin startproject projectname ,或者直接通过pycharm创建

      创建app
        cd 工程名
        python manage.py startapp cmdb

      setting.py 设置  

        STATICFILES_DIRS = (
          os.path.join(BASE_DIR, "static"),    #如果不配置会出现js、css、图片等访问失败
        )  

        DIRS ==> [os.path.join(BASE_DIR,'templates'),]    #html模板路径

        middlerware  # 注释 csrf   #否则请求当前页面会出现CSRF错误

        INSTALLED_APPS = [
          'django.contrib.admin',
          'django.contrib.auth',
          'django.contrib.contenttypes',
          'django.contrib.sessions',
          'django.contrib.messages',
          'django.contrib.staticfiles',
          'appname',        # 如果不配置会出现not in INSTALLED_APPS错误
        ]            

        ATABASES = {        # 数据库配置
         'default': {
         'ENGINE': 'django.db.backends.mysql',  # 使用mysql的时候配置,默认使用sqlit3
         'NAME': 'django',              # 库名称
         'USER': 'glen',                # 用户名
         'PASSWORD': 'starcor',            # 密码
         'HOST': 'www.puity.com',           #主机
         'PORT': '3306',                  #端口
         }
        }

      在APP/model.py里面添加表
        class User(models.Model):
         name = models.CharField(max_length=32)
         email = models.CharField(max_length=64)
         password = models.CharField(max_length=64)
         type = models.IntegerField()

      在app/admin.py里面注册表,让admin可以进行管理
        from bms import models
        admin.site.register(models.User)

      python.exe manage.py makemigrations appname  # 初始化,生成initial.py
      python.exe manage.py migrate            # 开始创建表
      python.exe manage.py createsuperuser       #创建admin,可通过http://host:port/admin来管理数据库表

    2、路由与基本的交互逻辑

      1、在urls.py里面设置路由  

      urlpatterns = [
       url(r'^home_page/user_delete_(?P<uid>d+).html', views.user_delete, name="user_delete"),
       url(r'^home_page/user_edit_(?P<uid>d+).html', views.user_edit, name="user_edit"),
       url(r'^home_page/user_add.html', views.user_add, name="user_add"),
       url(r'^home_page/group_(?P<gid>d+).html', views.detail_group, name="detail_group"),
       url(r'^home_page/user_(?P<uid>d+).html', views.detail_user, name="detail_user"),
       url(r'^home_page/user_list.html', views.user_list, name="user_list"),
       url(r'^home_page/group_list.html', views.group_list, name="group_list"),
       url(r'^login/$', views.login, name="login"),
       url(r'^home_page/$', views.home_page, name="home_page"),
      ]
      最后的name参数可以直接通过{{ name }}的方式放到模版中,可以自动帮忙渲染,不需要手动修改。
      (?P<uid>d+)相当于是传递给后面函数的一个参数,名字叫uid,多个可以使用**kwargs,如果没有?P<uid>就相当于位置参数,多个可以使用*args

      2、在app/views.py里面写交互逻辑 

        def login(request):
         if request.method == "POST":
         username = request.POST.get('username')    # 获取post提交的表单数据
         password = request.POST.get('password')
         try:
         db_password = models.User.objects.get(name=username).password  # 通过数据库表查询密码
         if password == db_password:
         return render(request, 'index.html')    # 返回管理界面
         else:
         return render(request, 'login.html', {'pwdError': '密码错误'})  # 密码错误,返回登陆界面,后面的字典需要和login.html里面的模版语言配合使用
         except Exception as e:
         print(e)
         return render(request, 'login.html', {'nameError': '用户名错误'})
         return render(request, 'login.html')

      3、通过访问呢http://host:port/login/  或 http://host:port就能访问到管理页面

    3、特殊的模版语言

        {% for host in hosts %}  # 由于模版返回的是一个字典{‘hosts':hosts},value hosts是一个包含多个字典的列表
          <tr>
            <td><input type="checkbox" name="IDCheck" value="14458579642011" class="acb" /></td>
            <td>{{ host.hostname }}</td>
            <td>{{ host.ip }}</td>
            <td>{{ host.port }}</td>
            <td>{{ host.type }}</td>
            <td>{{ host.group }}</td>
            <td>{{ host.user }}</td>
            {% if host.status == 1 %}  # 还可以嵌套if  else
            <td>启用</td>
            {% else %}
            <td>停用</td>
            {% endif %}
            <td>
              <a href="house_edit?fyID=14458579642011" class="edit">编辑</a>
              <a href="javascript:del('14458579642011');">删除</a>
            </td>
          </tr>
        {% endfor %}

        # 业务请求处理做的页面渲染
        return render("request", "template.html", {"k1": "v1", "k2": [11, 22, 33], "k3": {"nid": 12, "name": "aaa"})

        # html页面模板语法
        {{ k1 }}
        {{ k2.0 }} # 取列表中的第一个值,通过.获取
        {{ k3.name }} # 取字典中对应key的值

        # for循环

        {% for k,v in k3.items %}

          {{ k }} - {{ v }}

        {% endfor %}
        {% for item in k2 %}
          {{ item }},
          {{ forloop.counter }}, # 索引,从1开始,类似于python中的enumerate,
          {{ forloop.counter0 }}, # 索引,从0开始,类似于python中的enumerate,
          {{ forloop.first }}, # 判断当前item是否是第一个元素,成立为True,不成立为False
          {{ forloop.last }}, # 判断当前item是否是最后一个元素,成立为True,不成立为False
          {{ forloop.revcounter }} # 倒序索引,与forloop.counter 相反
        {% endfor %}

        内置函数

        {{ k1|lower }} # 将所有字母都变为小写
        {{ k1|first|upper }} # 将首字母变为大写
        {{ k1|truncatewords:"30" }} # 取变量k1的前30个字符
        {{ item.createTime|date:"Y-m-d H:i:s" }} # 将时间转为对应格式显示

    4、用户数据

      获取用户请求中的数据:
        request.POST.get()  #如果参数只有一个值直接使用get获取
        request.GET.get()
        reqeust.FILES.get()  

        # checkbox,     # 如果是复选框则需要使用getlist
        ........getlist()

        request.path_info    # 获取用户的uri


        文件对象 = reqeust.FILES.get()  
        文件对象.name
        文件对象.size
        文件对象.chunks()

        # <form 特殊的设置></form>


       给用户返回数据:
        render(request, "模板的文件的路径", {'k1': [1,2,3,4],"k2": {'name': '张扬','age': 73}})
        redirect("URL")    # 重定向
        HttpResponse(字符串)  # 直接返回字符串,一般使用返回json

    5、ORM

      增
        models.User.objects.create(name='qianxiaohu',age=18)
        dic = {'name': 'xx', 'age': 19}
        models.User.objects.create(**dic)
        obj = models.User(name='qianxiaohu',age=18)
        obj.save()
      删
        models.User.objects.filter(id=1).delete()
      改
        models.User.objects.filter(id__gt=1).update(name='alex',age=84)  # id__gt=1    id大于1
        dic = {'name': 'xx', 'age': 19}
        models.User.objects.filter(id__gt=1).update(**dic)
      查
        models.User.objects.filter(id=1,name='root')
        models.User.objects.filter(id__gt=1,name='root')
        models.User.objects.filter(id__lt=1)    # id小与1
        models.User.objects.filter(id__gte=1)   # id大于等于1
        models.User.objects.filter(id__lte=1)   # id小与等于1

        models.User.objects.filter(id=1,name='root')
        dic = {'name': 'xx', 'age__gt': 19}
        models.User.objects.filter(**dic)

        v1 = models.Business.objects.all()
        # QuerySet ,内部元素都是对象

        # QuerySet ,内部元素都是字典
        v2 = models.Business.objects.all().values('id','caption')
        # QuerySet ,内部元素都是元组
        v3 = models.Business.objects.all().values_list('id','caption')

        # 获取到的一个对象,如果不存在就报错
        models.Business.objects.get(id=1)
        对象或者None = models.Business.objects.filter(id=1).first()


      外键:
        v = models.Host.objects.filter(nid__gt=0)
        v[0].b.caption ----> 通过.进行跨表

      外键:
        class UserType(models.Model):
          caption = models.CharField(max_length=32)

        class User(models.Model):
          age = models.IntergerFiled()
          name = models.CharField(max_length=10)
          user_type = models.ForeignKey("UserType",to_field='id') # 约束,

      多对多

      方式一:自定义关系表
        class Host(models.Model):
          nid = models.AutoField(primary_key=True)
          hostname = models.CharField(max_length=32,db_index=True)
          ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
          port = models.IntegerField()
          b = models.ForeignKey(to="Business", to_field='id')
       
        class Application(models.Model):
          name = models.CharField(max_length=32)
        
        class HostToApp(models.Model):
          hobj = models.ForeignKey(to='Host',to_field='nid')
          aobj = models.ForeignKey(to='Application',to_field='id')

      方式二:自动创建关系表
        class Host(models.Model):
          nid = models.AutoField(primary_key=True)
          hostname = models.CharField(max_length=32,db_index=True)
          ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
          port = models.IntegerField()
          b = models.ForeignKey(to="Business", to_field='id')

        class Application(models.Model):
          name = models.CharField(max_length=32)
          r = models.ManyToManyField("Host")

        无法直接对第三张表进行操作

        obj = Application.objects.get(id=1)
        obj.name

        # 第三张表操作
        obj.r.add(1)
        obj.r.add(2)
        obj.r.add(2,3,4)
        obj.r.add(*[1,2,3,4])

        obj.r.remove(1)
        obj.r.remove(2,4)
        obj.r.remove(*[1,2,3])

        obj.r.clear()  # 清空id=1应用对用的记录

        obj.r.set([3,5,7])
        
        # 所有相关的主机对象“列表” QuerySet
        obj.r.all()


  • 相关阅读:
    ASP.NET 表单验证 Part.1(理解表单验证)
    Silverlight 简介 Part.3(设计 Siverlight 页面)
    ASP.NET 成员资格 Part.3(LoginStatus、LoginView、PasswordRecovery)
    ASP.NET 网站部署 Part.1(安装IIS、复制文件部署网站)
    ASP.NET Dynamic Data Part.1(创建动态数据应用程序)
    ASP.NET 安全模型 Part.2(SSL)
    ASP.NET MVC Part.2(扩展基本的 MVC 应用程序)
    ASP.NET 网站部署 Part.2(使用 Web 部署)
    开发高级 Web 部件
    创建 Web 部件(WebPart 类、简单的 Web 部件)
  • 原文地址:https://www.cnblogs.com/starcor/p/10127869.html
Copyright © 2011-2022 走看看