Httpresponse:直接返回字符创
render:返回html页面,并且支持模板语法
redirect:主要用于重定向
在项目目录下创建static文件夹
配置文件中开设相应的接口
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
request.method # 获取请求方式 结果是纯大写的字符串
request.POST # 获取POST请求发送来的普通数据(不包含文件)
request.POST.get() # 默认只获取列表中最后一个数据值
request.POST.getlist() # 获取键对应的整个列表 无论有几个数据值
request.GET # 获取url后面携带的非敏感数据
request.GET.get() # 默认只获取列表中最后一个数据值
request.GET.getlist() # 获取键对应的整个列表 无论有几个数据值
orm:对象关系映射;使用python的语法操作MySQL
class User(models.Model): # 类似于定义了表名
# id int primary key auto_increment
id = models.AutoField(primary_key=True) # 类似于定义了主键
# name varchar(32)
name = models.CharField(max_length=32) # 类似于定义了普通字段
# pwd int
pwd = models.IntegerField() # 类似于定义了普通字段
xxx = models.ForeignKey(to='绑定字段名',on_delete=models.CASCADE)
xxx = models.ManyToManyField(to='绑定字段名')
xxx = models.OneToOneField(to='绑定字段名',on_delete=models.CASCADE)
path('网址后缀', 函数名) # 路由匹配上执行函数
# path转换器:当网址后缀不固定时使用
path('网址后缀/' ,函数名)
# 正则匹配
re_path('正则表达式', 函数名) # 只要能够匹配上正则表达式就执行函数
# 正则之无名分组
re_path('正则表达式/(正则表达式)', 函数名) # 正则表达式分组匹配到的内容会当做视图函数的位置参数传入
# 正则之有名分组
re_path('正则表达式/(?P<名字>正则表达式', 函数名) # 正则表达式分组匹配到的内容会当做视图函数的关键字参数传入
给路由对应关系起别名
path('网址后缀/', 视图函数, name='别名')
html页面
{% url 'reg_view' %}
后端
from django.shortcuts import reverse
reverse('reg_view')
当路由中有不确定的匹配因素,反向解析的时候需要提前给出一个具体的值
reverse('别名', args=('值',))
{% url '别名' '值' %}
让每个应用都有自己的urls、templates文件夹、static文件夹
总路由将请求分发给各自的应用
# 总路由
path('app01/', include('app01.urls'))
# 子路由
path('func/', views.func)
有路由分发场景下多个应用在涉及到反向解析别名冲突的时候无法正常解析
解决方式1
名称空间
namespace
path('app01/', include(('app01.urls', 'app01'), namespace='app01'))
path('app01/', include(('app01.urls', 'app02'), namespace='app02'))
解决方式2
别名不冲突即可
视图函数的返回值必须是一个Httpresponse对象
from django.http import JsonResponse
def func(request):
d1 = [11, 22, 33]
return JsonResponse(func)
from表单method属性必须是post,enctype属性值必须是multipart/form-data
后端获取数据:request.FILES
FBV:基于函数的视图
CBV:基于类的视图
return render(request, 'html文件', {'name':name}
return render(request, 'html文件', locals()
类似于python的内置函数
<p>统计长度:{{ s|length }}</p>
<p>加法运算:{{ i|add:123 }}、加法运算:{{ s|add:'heiheihei' }}</p>
<p>日期转换:{{ s|date:'Y-m-d H:i:s' }}</p>
<p>文件大小:{{ file_size|filesizeformat }}</p>
<p>数据切片:{{ l|slice:'0:10' }}</p>
<p>字符截取(三个点算一个):{{ s1|truncatechars:6 }}</p>
<p>单词截取(空格):{{ s1|truncatewords:6 }}</p>
<p>语法转义:{{ script_tag|safe }}</p>
类似于python流程控制
{% if 条件 %}
{% elif 条件 %}
{% else %}
{% endif %}
{% for i in s %}
{% endfor %}
如果想自定义 必须先做以下三件事
# 自定义过滤器
@register.filter(name='myfilter')
def my_add(a, b):
return a + b
# 自定义标签函数
@register.simple_tag(name='mt')
def func(a, b, c, d):
return a + b + c + d
# 自定义inclusion_tag
@register.inclusion_tag(filename='it.html')
def index(n):
html = []
for i in range(n):
html.append('第%s页'%i)
return locals()
{% load mytag %}
{{ i|myfilter:1 }}
{% mt 1 2 3 4 %}
{% index 10 %}
能够继承母版的样式,并且能够部分修改
{% extends 'html文件名' %}
{% block 名字 %}
模板内容
{% endblock %}
将html页面的某个部分当做模块的形式导入使用
{% include ‘menu.html’ %}