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