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的方法

原文地址:https://www.cnblogs.com/Python1/p/9187881.html