模板层
后端朝 html 页面传递数据
两种给 HTML 页面传递数据的方式
第一种:
render(request,'index.html',{'user_list':user_list})
第二种
render(request,'index.html',locals())
后端可以给 HTML 传递的数据有哪些
python 所有的基本数据类型
函数名(传函数名会自动加括号执行)
对象(相当于在前端页面打印了该对象)
前端访问容器类型数据的属性或方法统一采用句点符(.)
有序类型 直接点索引访问
字典 直接点 key
在调用函数或方法的时候不支持传参
过滤器
n|length 统计长度
- n|default:'不存在'
- n|date:'Y-m-d'
- n|filesizeformat
- n|slice:'0:8:2'
- n|truncatechars:10
- n|truncatewords:10
- n|add:1
- n|safe
前后端取消转义的方式
前端转义
|safe
后端转义
- from django.utils.safestring import mark_safe()
- mark_safe("<h1 > 我是 h1 标签</h1>")
标签
- {% for foo in user_list%}
- {{ foo }}
- {{ forloop }}
- {% empty %}
当传递给我的循环对象是个空的情况下才会走 empty 下面的代码块
- {% endfor %}
- {% if flag %}
flag 有值
{% elif tag %}
tag 有值
{% else %}
两个都没值
{% endif %}
前端模板语法 for 循环和 if 判断也可以嵌套使用
- {% with hobby.2.1.2.1.2.3.4.3 as h%}
- {{ h }}
- {{ hobby.2.1.2.1.2.3.4.3 }}
- {% endwith %}
自定义过滤器, 标签, inclusion_tag
必备三步走战略
1. 在应用下新建一个名字必须叫做 templatetags 文件夹
2. 在新建的文件夹下新建一个任意名的 py 文件(my_tag.py)
3. 在新建的 py 文件中固定写下面两句话
- from django import template
- register = template.Library()
- # 自定义过滤器
- @register.filter(name='baby')
- def index(a,b):
- return a+b
- # 自定义标签
- @register.simple_tag(name='index')
- def index(a,b,c,d):
- return a+b+c+d
- # 自定义 inclusion_tag
- @register.inclusion_tag('login.html',name='xxx')
- def index(n):
- # 产生 login.HTML 小页面所需要的数据
- return {"data":data}
HTML 中如何使用自定义的过滤器, 标签, inclusion_tag
- # 先加载
- {% load my_tag %}
- {{ num|baby:10 }}
- {% index 1 2 3 4 %}
- {% xxx 10 %}
模板的继承与导入
index.HTML
{% block content %}
主页内容
{% endblock %}
继承模板
- {% extends 'index.html'%}
- {% block content %}
- {{ block.super }}
子页面内容
{% endblock %}
模板的导入
{% include 'login.html' %}
ps: 一个模板中通常 block 块儿越多页面的可扩展性越强
一般习惯性的取三块儿内容
- CSS
- content
- JS
静态文件配置
{% load static %}
两种动态获取路径的方式
- <link rel='stylesheet' href="{% static'css/mycss.css'%}"> # 第一种方式
- <link rel='stylesheet' href="{% get_static_prefix %}css/mycss.css"> # 第二种方式
模型层
django ORM 操作
关键性字段及参数
DateField 年月日
DateTimeField 年月日时分秒
auto_now: 每次操作改数据都会自动更新时间
auto_now_add: 新增数据的时候会将当前时间自动添加, 后续的修改该字段不会自动更新
单独的 py 文件测试 ORM 操作需要配置的参数
- import os
- if __name__ == "__main__":
- os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day58.settings")
- import django
- django.setup()
- from app01 import models # 这一句话必须在这下面导入
主要是 queryset 对象就可以无限制的点 queryset 方法(*******************)
models.User.objects.filter().filter().filter().count()
单表查询
********************************** 查询方法 ******************************************
- <1> all(): 查询所有结果
- <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象
- <3> get(**kwargs): 返回与所给筛选条件相匹配的对象, 返回结果有且只有一个, 如果符合筛选条件的对象超过一个或者没有都会抛出错误.(源码就去搂一眼~诠释为何只能是一个对象)
- <4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象
- <5> order_by(*field): 对查询结果排序('-id')/('price')
- <6> reverse(): 对查询结果反向排序>>>前面要先有排序才能反向
- <7> count(): 返回数据库中匹配查询 (QuerySet) 的对象数量.
- <8> first(): 返回第一条记录
- <9> last(): 返回最后一条记录
- <10> exists(): 如果 QuerySet 包含数据, 就返回 True, 否则返回 False
- <11> values(*field): 返回一个 ValueQuerySet-- 一个特殊的 QuerySet, 运行后得到的并不是一系列 model 的实例化对象, 而是一个可迭代的字典序列
- <12> values_list(*field): 它与 values()非常相似, 它返回的是一个元组序列, values 返回的是一个字典序列
- <13> distinct(): 从返回结果中剔除重复纪录
返回 queryset 对象的方法
- all()
- filter()
- exclude()
- order_by()
- reverse()
- distinct()
values() 返回一个可迭代的字典序列
values_list() 返回一个可迭代的元祖序列
多表查询
表与表之间的关系
一对一(OneToOneField): 一对一字段无论建在哪张关系表里面都可以, 但是推荐建在查询频率比较高的那张表里面
一对多(ForeignKey): 一对多字段建在多的那一方
多对多(ManyToManyField): 多对多字段无论建在哪张关系表里面都可以, 但是推荐建在查询频率比较高的那张表里面
ps: 如何判断表与表之间到底是什么关系
换位思考
A 能不能有多个 B
B 能不能有多个 A
- add() # 添加
- set() # 修改
- remove() # 不能接收可迭代对象
- clear() # 清空 不用传参
正向与反向的概念
正向查询按字段, 反向查询按表名小写...
- # 一对一
- # 正向: author--- 关联字段在 author 表里 --->authordetail 按字段
- # 反向: authordetail--- 关联字段在 author 表里 --->author 按表名小写
- # 查询 jason 作者的手机号 正向查询
- # 查询地址是 : 山东 的作者名字 反向查询
- # 一对多
- # 正向: book--- 关联字段在 book 表里 --->publish 按字段
- # 反向: publish--- 关联字段在 book 表里 --->book 按表名小写_set.all() 因为一个出版社对应着多个图书
- # 多对多
- # 正向: book--- 关联字段在 book 表里 --->author 按字段
- # 反向: author--- 关联字段在 book 表里 --->book 按表名小写_set.all() 因为一个作者对应着多个图书
- # 查询出版社是东方出版社出版的书籍 一对多字段的反向查询
- # publish_obj = models.Publish.objects.filter(name='东方出版社').first()
- # print(publish_obj.book_set) # app01.Book.None
- # print(publish_obj.book_set.all())
- # 查询作者 jason 写过的所有的书 多对多字段的反向查询
- # author_obj = models.Author.objects.filter(name='jason').first()
- # print(author_obj.book_set) # app01.Book.None
- # print(author_obj.book_set.all())
- # 查询作者电话号码是 110 的作者姓名 一对一字段的反向查询
- # authordetail_obj = models.AuthorDetail.objects.filter(phone=110).first()
- # print(authordetail_obj.author.name)
F 与 Q 查询
配置文件配置参数查看所有 ORM 操作内部的 sql 语句
- LOGGING = {
- 'version': 1,
- 'disable_existing_loggers': False,
- 'handlers': {
- 'console':{
- 'level':'DEBUG',
- 'class':'logging.StreamHandler',
- },
- },
- 'loggers': {
- 'django.db.backends': {
- 'handlers': ['console'],
- 'propagate': True,
- 'level':'DEBUG',
- },
- }
- }
来源: http://www.bubuko.com/infodetail-3094885.html