内容概览
- Django
- 基本操作命令
- 命令行与pycharm操作的区别
- django必会三板斧
- 静态文件及相关配置
- request对象方法
- 连接MySQL
- orm
- 路由层
- 视图层
- 模板层
Django
基本操作命令
- cmd
- 创建django项目
django-admin startproject 项目名 - 运行django项目
python manage.py runserver ip:port - 创建app应用
python manage.py startapp 应用名
- 创建django项目
- pycharm
鼠标点击创建
命令行与pycharm操作的区别
- 命令行不会自动创建templates文件夹
- 命令行不会配置关于templates文件夹的配置
- pycharm自动创建的应用会自动注册到配置文件中
django必会三板斧
Httpresponse:直接返回字符创
render:返回html页面,并且支持模板语法
redirect:主要用于重定向
静态文件及相关配置
在项目目录下创建static文件夹
配置文件中开设相应的接口
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
request对象方法
request.method # 获取请求方式 结果是纯大写的字符串
request.POST # 获取POST请求发送来的普通数据(不包含文件)
request.POST.get() # 默认只获取列表中最后一个数据值
request.POST.getlist() # 获取键对应的整个列表 无论有几个数据值
request.GET # 获取url后面携带的非敏感数据
request.GET.get() # 默认只获取列表中最后一个数据值
request.GET.getlist() # 获取键对应的整个列表 无论有几个数据值
连接MySQL
- pycharm连接MySQL
- django连接MySQL
- 现在配置文件中修改配置
- 指定连接MySQL的模块
orm
orm:对象关系映射;使用python的语法操作MySQL
- 先去应用目录下的models.py编写模型类
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() # 类似于定义了普通字段
- 数据库迁移命令
- python manage.py makemigretions
- python manage.py migrate
orm语法
- 查:models.表名.object.filter()
- 增:models.表名.object.create()
- 改:models.表名.object.filter().update()
- 删:models.表名.object.filter().remove()
orm外键
- 一对多
xxx = models.ForeignKey(to='绑定字段名',on_delete=models.CASCADE)
- 多对多
xxx = models.ManyToManyField(to='绑定字段名')
- 一对一
xxx = models.OneToOneField(to='绑定字段名',on_delete=models.CASCADE)
路由层
路由匹配
path('网址后缀', 函数名) # 路由匹配上执行函数
# path转换器:当网址后缀不固定时使用
path('网址后缀/<int:名字>',函数名)
# 正则匹配
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对象
视图函数返回json格式数据
from django.http import JsonResponse
def func(request):
d1 = [11, 22, 33]
return JsonResponse(func)
form表单携带文件数据
from表单method属性必须是post,enctype属性值必须是multipart/form-data
后端获取数据:request.FILES
FBV与CBV
FBV:基于函数的视图
CBV:基于类的视图
模板层
模板语法传值
- 方式1:
return render(request, 'html文件', {'name':name}
- 方式2:
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 %}
自定义标签函数、过滤器、inclusion_tag
如果想自定义 必须先做以下三件事
- 在应用下创建一个名为templatetags文件夹
- 在该文件夹创建任意名称的py文件
- 在该py文件内编写自定义相关代码
from django.template import Library
register = Library()
# 自定义过滤器
@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’ %}