zoukankan      html  css  js  c++  java
  • Django框架

    Django框架

    路由系统----urls.py
    视图系统----views.py
    模板系统----Templates
    模型系统----models.py

    一、Django视图系统

    FBA:基于函数的视图
    CBV:基于类的视图,业务逻辑较复杂的时候可使用CBV,里面分不同的请求方式分不同的方法
        使用CBV时,urls.py中也做对应的修改,在类名后加上.as_view()
        如:url(r'^add_class/$', views.AddClass.as_view()),

    1、request对象

    请求相关的常用值:
    request.path_info            返回用户访问url,不包括域名和参数
    request.get_full_path()    获取URL中的路径和参数
    request.method              请求中使用的HTTP方法的字符串表示,全大写表示。
    request.GET                  包含所有HTTP GET参数的类字典对象
    request.POST               包含所有HTTP POST参数的类字典对象
    request.body                 请求体,byte类型,request.POST的数据就是从body里面提取到的

    request.FILES           上传文件

    前端向后端发送请求的方式:

    1)、直接在浏览器地址栏输入URL访问 --> GET
    2)、点击a标签跳转到指定页面 --> GET
    3)、form表单 --> GET/POST
    4)、AJAX --> GET/POST

    上传文件的注意事项:
    1)、如果有上传文件,views.py中应该从request.FILES中取上传的文件对象
    2)、如果有上传文件,html文件中的form表单一定要加 enctype="multipart/form-data"

    代码实现:
    file_obj = request.FILES.get("touxiang")         # 拿到上传文件对象
    file_name = file_obj.name                  # 拿到文件名
    with open(file_name, "wb") as f:         # 在本地新建一个同名文件
        for line in file_obj.chunks():            # 从上传的文件对象中一点一点读取数据
        f.write(line)                                     # 写到新建的文件中

    2、Response对象

     HttpResponse、render、redirect

    3、JsonResponse对象

    JsonResponse是HttpResponse的子类,专门用来生成JSON格式数据的响应。

    代码:
    from django.http import JsonResponse
    JsonResponse(字典)
    JsonResponse(列表,safe=False)

    默认只能传递字典类型,如果要传递非字典类型需要设置一下safe关键字参数,如:response = JsonResponse([1, 2, 3], safe=False)

    二、Django模板系统

    只需要记两种特殊符号:{{ }}和 {% %},变量相关的用{{ }},逻辑相关的用{% %},点 . 用来获取对象的相应属性值和方法(方法不要加括号,属性的优先级大于方法),按索引取值也用点

    as 语句将内容取别名(相当于定义一个变量)

    1、模板中获取当前网址,当前用户等

    {{ request.user }}       获取当前用户
    {{ request.path }}       获取当前网址
    {{ request.GET.urlencode }}      获取当前 GET 参数


    2、if/else 标签

    根据条件判断是否输出。if/else 支持嵌套,接受 and , or 或者 not 关键字来对多个变量做判断 ,或者对变量取反( not )

    语法:
    {% if 条件 %}
        html代码
    {% endif %}

    或:
    {% if 条件1 %}
        html代码
    {% elif 条件2 %}
        html代码
    {% else %}
        html代码
    {% endif %}


    3、for 循环标签

    在一个序列上迭代,循环语法是 for X in Y。可以嵌套使用 {% for %} 标签
    每一次循环中,模板系统会渲染在 {% for %} 和 {% endfor %} 之间的所有内容

    for循环可用的一些参数:
    forloop.counter         当前循环的索引值(从1开始)
    forloop.counter0       当前循环的索引值(从0开始)
    forloop.revcounter     当前循环的倒序索引值(从1开始)
    forloop.revcounter0   当前循环的倒序索引值(从0开始)
    forloop.first                当前循环是不是第一次循环(布尔值)
    forloop.last                当前循环是不是最后一次循环(布尔值)
    forloop.parentloop     本层循环的外层循环

    for ... empty         当列表中可能为空值时

    with         定义一个中间变量


    4、ifequal/ifnotequal 标签

    {% ifequal %} 标签比较两个值,当他们相等时,显示在 {% ifequal %} 和 {% endifequal %} 之中所有的值,支持可选的 {% else%}

    5、注释标签

    {# 注释内容 #}

    6、Filters过滤器

    1)、模板过滤器可以在变量被显示前修改它,过滤器使用管道字符 | ,注:'|'的左右没有空格
    如:{{ name|lower }},意思是{{ name }} 变量被过滤器 lower 处理后,文档大写转换文本为小写

    2)、过滤管道可以被套接,即一个过滤器管道的输出又可以作为下一个管道的输入

    {{ my_list|first|upper }},意思是将第一个元素并将其转化为大写

    3)、过滤器可以有参数,过滤器的参数跟随冒号之后并且总是以双引号包含
    语法: {{ value|filter_name:参数 }}
    如:{{ bio|truncatewords:"30" }}代表将显示变量 bio 的前30个词。

    4)、addslashes : 添加反斜杠到任何反斜杠、单引号或者双引号前面

    5)、date :按指定的格式字符串参数格式化 date 或者 datetime 对象,实例:{{ pub_date|date:"F j, Y" }}

    6)、length :返回变量的长度

    7)、filesizeformat:将值格式化为一个 “人类可读的” 文件尺寸

    {{ value|filesizeformat }},如果 value 是 123456789,输出将会是 117.7 MB

     8)、slice切片

    9)、safe
    为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的,不必转义
    {{ value|safe}}

    10)、truncatechars
    如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾
    {{ value|truncatechars:9}}

    11)、自定义过滤器

    1、在app下面新建一个Python包,包名必须叫 templatetags
    2、在上面的包中新建一个python文件,里面定义函数,并且注册到django的模板语言

    代码:
    from django import template
    register = template.Library() # 生成一个用于注册自定义filter方法的实例

    @register.filter(name="sb")
    def add_sb(value):
        return "{} sb".format(value)

    3、使用自定义的filter方法
    {% load py文件名 %}
    {{ value|sb }}


    7、组件

    include 标签
    {% include %} 标签允许在模板中包含其它的模板的内容
    {% include "nav.html" %},模板中包含了 nav.html 模板


    8、模板继承

    block块

    模板可以用继承的方式来实现复用

    通过在母板中使用{% block xxx %}来定义"块",在子页面中通过定义母板中的block名来对应替换母板中相应的内容。

    9、csrf_token

    在页面的form表单里面写上{% csrf_token %},用于跨站请求伪造保护


    三、Django路由系统

    1、正则匹配的模式

    1)、分组匹配 --> 调用视图函数的时候额外传递 位置参数
    2)、分组命名匹配 --> 调用视图函数的时候额外传递 关键字参数

    注意:
    1、要么全都用分组匹配,要么全都用分组命名匹配, 不要混着用
    2、django URL正则表达式匹配的位置:从第一个斜线到问号之前的这一段路径
    3、URL正则表达式捕获的值都是字符串类型
    4、可以给视图函数的参数设置默认值


    2、include分级路由

    from django.conf.urls import url, include
    url(r'^myapp/', include("myapp.urls"))

    查找的顺序:请求 --> project/urls.py --> app/urls.py --> app/views.py


    3、URL匹配规则的别名

    用法:
    1)、在views.py中根据别名找到url

    from django.urls import reverse
    url = reverse('别名')

    2)、在模板语言中根据别名找到url

    {% url '别名' %}


    4、URL反向解析

    方法:
    1)、位置参数

    1. 在views.py中:
    reverse("别名", args=(参数1, 参数2, ...))

    2. 在模板语言中:
    {% url "别名" 参数1, 参数2... %}

    2)、关键字参数

    1. 在views.py中:
    reverse("别名", kwargs={"k1":参数1, ...})

    2. 在模板语言中:
    {% url "别名" 参数1, 参数2... %}

    四、Django模型系统ORM

    1、数据库的操作(增删改查)

    1)、单表操作:
        1. models.类名.objects.all()         查所有

        2. models.类名.objects.get(id=1)      根据id查单条数据

        3. models.类名.objects.get(id=1).delete()     删除单条数据

        4. 修改
            obj = models.类名.objects.get(id=1)
            obj.name = "新名字"
            obj.save()

        5. 新增
            models.类名.objects.create(name="名字")

    2)、外键的操作

    3)、多对多的操作


    2、ORM字段

    1)、AutoField
    2)、CharField
    3)、ForeignKey
    4)、ManyToManyField
    5)、DateField


    3、字段参数

    1)、null        用于表示某个字段可以为空
    2)、unique        如果设置为unique=True,则该字段在此表中必须是唯一的
    3)、db_index         如果db_index=True,则代表着为此字段设置索引
    4)、default       为该字段设置默认值
    5)、auto_now_add       配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库
    6)、auto_now         配置上auto_now=True,每次更新数据记录的时候会更新该字段


    4、关系字段

    1)、ForeignKey
    一般把ForeignKey字段设置在 '一对多'中'多'的一方
    1、to     设置要关联的表
    2、to_field      设置要关联的表的字段
    3、on_delete      当删除关联表中的数据时,当前表与其关联的行的行为
    4、db_constraint      是否在数据库中创建外键约束,默认为True

    2)、OneToOneField
    一对一字段,通常一对一字段用来扩展已有字段

    3)、ManyToManyField
    用于表示多对多的关联关系。在数据库中通过第三张表来建立关联关系。


    5、ORM操作

    过滤器filter() 支持 双下划线 操作:
    filter(id__lt=10, id__gt=1)      获取id大于1 且 小于10的值
    filter(id__in=[11, 22, 33])      获取id等于11、22、33的数据
    exclude(id__in=[11, 22, 33])       not in,不在里面
    filter(name__contains="ven")        获取name字段包含"ven"的
    filter(name__icontains="ven")        icontains大小写不敏感
    filter(id__range=[1, 3])        id范围是1到3的,等价于SQL的bettwen and


    从数据库中查询出来的结果一般是一个集合,这个集合叫做 QuerySet

    1)、返回QuerySet类型的:
    1. all()
    2. filter()
    3. exclude()
    4. order_by()
    5. reverse()
    6. distinct()

    特殊的QuerySet:
    values() 返回一个可迭代的字典序列
    values_list() 返回一个可迭代的元祖序列

    2)、返回具体对象:
    1. get()
    2. first()
    3. last()

    3)、返回具体数字:
    count()

    4)、返回布尔值的:
    exists()

    6、表的查询

    1)、外键的查询
    正向查询:基于对象的查询、基于双下划线的查询

    反向查询:基于对象的查询、基于双下划线的查询
    QuerySet对象才能调用values

    2)、多对多关系

    ManyToManyField()多设置在正向查询多的那一边

    三种建立多对多关系的方式
    1. 自己创建第三张表,分别外键关联两张表
    2. ORM自带的ManyToManyField()建立多对多关联关系
    3. 自己创建第三张表,并且设置ManyToManyField()关联关系(中介者模型)

    3)、聚合查询

    aggregate()是QuerySet 的一个终止子句,意思是它返回一个包含一些键值对的字典。键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的。

    4)、分组查询
    为调用的QuerySet中每一个对象都生成一个独立的统计值


    7、F查询

    专门取对象中某列值的操作

    1)、两个字段之间做比较
    2)、字符串拼接


    8、Q查询

    对对象的复杂查询

    1)、Q对象(django.db.models.Q)可以对关键字参数进行封装,从而更好地应用多个查询
    2)、可以组合使用 & | 操作符,当一个操作符是用于两个Q的对象,它产生一个新的Q对象
    3)、Q对象可以用 ~ 操作符放在前面表示否定,也可允许否定与不否定形式的组合
    4)、如果Q查询和关键字查询同时存在时,Q查询要放在关键字查询的前面


    9、事务


    10、ORM执行原生SQL的方法

  • 相关阅读:
    【JBPM4】创建流程实例
    【JBPM4】流程部署
    Table上下滚动
    oracle 导入dmp文件
    Win7下安装Oracle 10g
    【Hibernate3.3复习知识点二】
    通过IP地址和子网掩码计算主机数
    vue.js知识总结
    vue生产环境部署总结
    移动端上遇到的各种坑与相对解决方案
  • 原文地址:https://www.cnblogs.com/Python1/p/9187881.html
Copyright © 2011-2022 走看看