一、 模板层
1.1 过滤器
1.什么是过滤器?
过滤器类似于python的内置函数,用来把变量值加以修饰后再显示。
2. 语法
1、
{{ 变量名|过滤器名 }}2、链式调用:上一个过滤器的结果继续被下一个过滤器处理
{{ 变量名|过滤器1|过滤器2 }}3、有的过滤器取需要参数
{{ 变量名|过滤器名:传给过滤器的参数 }}
3. 常用内置过滤器
#0、default
#作用:如果一个变量值是False或者为空、None,使用default后指定的默认值,否则,使用变量本身的值,如果value=’‘则输出“nothing”
{{ value|default:"nothing" }}#1、default_if_none
#作用:如果只针对value是None这一种情况来设置默认值,需要使用default_if_none
#只有在value=None的情况下,才会输出“None...”,
{{ value|default_if_none:"None..." }}#2、length
#作用:返回值的长度。它对字符串、列表、字典等容器类型都起作用,如果value是 ['a', 'b', 'c', 'd'],那么输出是4
{{ value|length }}#3、filesizeformat
#作用:将值的格式化为一个"人类可读的"文件尺寸(如13KB、4.1 MB、102bytes等等),如果 value 是 12312312321,输出将会是 11.5 GB
{{ value|filesizeformat }}#4、date
#作用:将日期按照指定的格式输出,如果value=datetime.datetime.now(),按照格式Y-m-d则输出2019-02-02
{{ value|date:"Y-m-d" }}#5、slice
#作用:对输出的字符串进行切片操作,顾头不顾尾,如果value=“egon“,则输出"eg"
{{ value|slice:"0:2" }}#6、truncatechars
#作用:如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾,如果value=”hello world egon 嘎嘎“,则输出"hello...",注意8个字符也包含末尾的3个点
{{ value|truncatechars:8 }}#7、truncatewords
#作用:同truncatechars,但truncatewords是按照单词截断,注意末尾的3个点不算作单词,如果value=”hello world egon 嘎嘎“,则输出"hello world ..."
{{ value|truncatewords:2 }}
1.2 标签
1. 标签的作用
1、一些标签用来在输出中创建文本
2、一些标签用来进行流程控制(执行循环或者if判断)
3、一些标签用来将外部信息加载到模板中以供以后的变量使用
2. 格式
# 1、
{% 标签名 %}# 2、大多数标签都需要接收参数
{% 标签名 参数1 参数2 %}# 3、一些标签需要有开始{% tag %}和结束标记{% endtag %}
{% 标签名 %}
...内容...
{% end标签名 %}
3 .常用的标签之for标签
1、遍历每一个元素:
{% for person in person_list %}
<p>{{ person.name }}</p>
{% endfor %}2、可以利用{% for obj in list reversed %}反向循环。
3、遍历一个字典:
{% for key,val in dic.items %}
<p>{{ key }}:{{ val }}</p>
{% endfor %}4、循环序号可以通过{{ forloop }}显示
forloop.counter 当前循环的索引值(从1开始)
forloop.counter0 当前循环的索引值(从0开始)
forloop.revcounter 当前循环的倒序索引值(从1开始)
forloop.revcounter0 当前循环的倒序索引值(从0开始)
forloop.first 当前循环是第一次循环则返回True,否则返回False
forloop.last 当前循环是最后一次循环则返回True,否则返回False
forloop.parentloop 本层循环的外层循环5、for标签可以带有一个可选的{% empty %} 从句,在变量person_list为空或者没有被找到时,则执行empty子句
{% for person in person_list %}
<p>{{ person.name }}</p>{% empty %}
<p>sorry,no person here</p>
{% endfor %}了解:Django框架的for循环,没有break和continue方法,可以使用自定义过滤器实现forloop | continue和forloop | break,参考:https://djangosnippets.org/snippets/2093/
4. 常用标签之if标签
1、注意:
{% if 条件 %}条件为真时if的子句才会生效,条件也可以是一个变量,if会对变量进行求值,在变量值为空、或者视图没有为其传值的情况下均为False2、具体语法
{% if num > 100 or num < 0 %}
<p>无效</p>
{% elif num > 80 and num < 100 %}
<p>优秀</p>
{% else %}
<p>凑活吧</p>
{% endif %}3、if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。
4、判断条件中可以引入过滤器
{% if athlete_list|length > 1 %}
Team: {% for athlete in athlete_list %} ... {% endfor %}
{% else %}
Athlete: {{ athlete_list.0.name }}
{% endif %}过滤器length返回的数字可用于与数字进行比较,除此之外大多数过滤器返回的都是字符串并不能用于与数字比较
5、补充标签firstof
针对下述多分支
{% if var1 %}
{{ var1 }}
{% elif var2 %}
{{ var2 }}
{% elif var3 %}
{{ var3 }}
{% endif %}可以简写为一行
{% firstof var1 var2 var3 %}也可以定义一个备用值,当var1、var2、var3均无值的时使用
{% firstof var1 var2 var3 "fallback value" %}
5. 常用标签之with标签
with标签用来为一个复杂的变量名起别名,如果变量的值来自于数据库,在起别名后只需要使用别名即可,无需每次都向数据库发送请求来重新获取变量的值
{% with li.1.upper as v %}
{{ v }}
{% endwith %}
1.3 模板的继承和导入
1. 模板的导入之include标签
作用:在一个模板文件中,引入/重用另外一个模板文件的内容,
{% include '模版名称' %}
2. 模板的继承\派生之extends标签、block标签
#用:在一个模板文件中,引入/重用另外一个模板文件的内容
{% extends "模版名称" %}
# 也就是说include有的功能extends全都有,但是extends可以搭配一个block标签,用于在继承的基础上定制新的内容
二、 模型层(跟数据库打交道的,重点核心)
2.1 单表的操作
create update delete all first filter # django自带的sqlite3数据库对日期格式不是很敏感 处理的时候容易出错 # 增 res = models.User.objects.create(name='jason',age=18,register_time='2002-1-21') print(res) import datetime ctime = datetime.datetime.now() user_obj = models.User(name='egon',age=84,register_time=ctime) user_obj.save() 删 res = models.User.objects.filter(pk=2).delete() print(res) """ pk会自动查找到当前表的主键字段 指代的就是当前表的主键字段 用了pk之后 你就不需要指代当前表的主键字段到底叫什么了 uid pid sid ... """ user_obj = models.User.objects.filter(pk=1).first() user_obj.delete() 修改 models.User.objects.filter(pk=4).update(name='egonDSB') user_obj = models.User.objects.get(pk=4) user_obj = models.User.objects.filter(pk=6) """ get方法返回的直接就是当前数据对象 但是该方法不推荐使用 一旦数据不存在该方法会直接报错 而filter则不会 所以我们还是用filter """ user_obj.name = 'egonPPP' user_obj.save()
2.2 常见的十几种查询方法
必知必会13条
# 1.all() 查询所有数据# 2.filter() 带有过滤条件的查询
# 3.get() 直接拿数据对象 但是条件不存在直接报错
# 4.first() 拿queryset里面第一个元素
# res = models.User.objects.all().first()
# print(res)
# 5.last()
# res = models.User.objects.all().last()
# print(res)# 6.values() 可以指定获取的数据字段 select name,age from ... 列表套字典
# res = models.User.objects.values('name','age') # <QuerySet [{'name': 'jason', 'age': 18}, {'name': 'egonPPP', 'age': 84}]>
# print(res)
# 7.values_list() 列表套元祖
# res = models.User.objects.values_list('name','age') # <QuerySet [('jason', 18), ('egonPPP', 84)]>
# print(res)
# """
# # 查看内部封装的sql语句
# 上述查看sql语句的方式 只能用于queryset对象
# 只有queryset对象才能够点击query查看内部的sql语句
#
# """
# 8.distinct() 去重
# res = models.User.objects.values('name','age').distinct()
# print(res)
"""
去重一定要是一模一样的数据
如果带有主键那么肯定不一样 你在往后的查询中一定不要忽略主键
"""
# 9.order_by()
# res = models.User.objects.order_by('age') # 默认升序
# res = models.User.objects.order_by('-age') # 降序
#
# print(res)
# 10.reverse() 反转的前提是 数据已经排过序了 order_by()
# res = models.User.objects.all()
# res1 = models.User.objects.order_by('age').reverse()
# print(res,res1)# 11.count() 统计当前数据的个数
# res = models.User.objects.count()
# print(res)
# 12.exclude() 排除在外
# res = models.User.objects.exclude(name='jason')
# print(res)# 13.exists() 基本用不到因为数据本身就自带布尔值 返回的是布尔值
# res = models.User.objects.filter(pk=10).exists()
# print(res)