今日学习目标
- 熟悉模块基础知识点学习
文章目录
学习内容
- 模板语法之过滤器
- 模板语法之标签(类似于流程控制)
- 自定义过滤器、标签、inclusion_tag
- 模板的导入
- 模板的继承
- 测试环境搭建
- ORM查询关键字使用
一、模板语法之过滤器
优点:类似于内置函数
特点:会将|左边的当做过滤器的第一个参数,将右边的当做过滤器第二个参数。
过滤器类似于python的内置函数,用来把视图传入的变量值加以修饰后再显示,具体语法如下
{{ 变量名|过滤器名:传给过滤器的参数 }}
常用内置过滤器
1、default
#作用:如果一个变量值是False或者为空,使用default后指定的默认值,否则,使用变量本身的值,如果value=’‘则输出“nothing”
{{ value|default:"nothing" }}
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 }}
8、safe
#作用:出于安全考虑,Django的模板会对HTML标签、JS等语法标签进行自动转义,例如value="<script>alert(123)</script>",模板变量{{ value }}会被渲染成<script>alert(123)</script>交给浏览器后会被解析成普通字符”<script>alert(123)</script>“,失去了js代码的语法意义,但如果我们就想让模板变量{{ value }}被渲染的结果又语法意义,那么就用到了过滤器safe,比如value='<a href="https://www.baidu.com">点我啊</a>',在被safe过滤器处理后就成为了真正的超链接,不加safe过滤器则会当做普通字符显示’<a href="https://www.baidu.com">点我啊</a>‘
{{ value|safe }}
内置过滤器safe用来前后端取消转义(前端代码并不一定非要在前端写,也可以在后端写好,传递给前端页面)
前端取消转义:|safe
后端取消转义:要先导一个模块:
from django.utils.safestring import mark_safe
sss = "<a href='www.baidu.com'>渡我不渡她</a>"
res = mark_safe(sss)
# 再把这个res传到前端
<p>{{ res }}</p> # 前端就能识别a标签了
9、add
给value加上一个add后面的数值
eg:给前端传个n=123,`{{ n|add:100 }}`这个过滤器结果就是n+100,在页面上显示的结果就是223.
补充:

续表:

二、模板语法之标签(类似于流程控制)
标签语法结构:
{% 名字 ...%}
{% end名字 %}
常见使用:if判断,for循环、with标签等。
if判断
{% if 条件1 %}
<p>你好啊</p>
{% elif 条件2 %}
<p>他好呀</p>
{% else %}
<p>大家好</p>
{% endif %}
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 %}
{% for key in dic.keys %}
<p>{{ key }}</p>
{% endfor %}
{% for val in dic.values %}
<p>{{ 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 %}
with标签
# with标签用来为一个复杂的变量名起别名,如果变量的值来自于数据库,在起别名后只需要使用别名即可,无需每次都向数据库发送请求来重新获取变量的值
{% with li.1.upper as v %}
{{ v }}
{% endwith %}
三、自定义过滤器、标签、inclusion_tag
步骤:
-
在应用名下面新建一个templatetags文件夹(必须叫这个名字)
-
在该文件夹下,新建一个任意名称的py文件
-
在该py文件内,固定先写两行代码:
from django.template import Library
register = Library()
自定义过滤器
视图层
py文件
from django.template import Library
register = Library()
@register.filter(name='myplus')
def index(a, b):
return a+b
模板层
HTML文件
{% load my_tag %}
{{ 123|myplus:123 }}
结果
这样前端页面显示的结果就是246
自定义标签
视图层
py文件
from django.template import Library
register = Library()
@register.simple_tag(name='mysm')
def login(a, b, c, d):
return '%s/%s/%/%s'%(a, b, c, d)
模板层
HTML文件
{% load my_tag %}
{% mysm 1 2 3 4 %}
结果
结果是1/2/3/4
自定义过滤器和标签的区别
#1、自定义过滤器只能传两个参数,而自定义标签却可以传多个参数
#2、过滤器可以用于if判断,而标签不能
{% if salary|my_multi_filter:12 > 200 %}
<p>优秀</p>
{% else %}
<p>垃圾</p>
{% endif %}
自定义inclusion_tag
视图层
py文件
@register.inclusion_tag('left.html')
def func2(n):
l1 = []
for i in range(1, n + 1):
l1.append(f'第{i}页')
return locals()
{% func2 10 %}
模板层
HTML文件
<ul>
{% for foo in l1 %}
<li>{{ foo }}</li>
{% endfor %}
</ul>
'''该方法需要先作用于一个局部html页面 之后将渲染的结果放到调用的位置'''
四、模板的导入
类似于将html页面上的局部页面做成模块的形式 哪个地方想要直接导入即可展示
eg:有一个非常好看的获取用户数据的页面 需要在网站的多个页面上使用
策略1:拷贝多份即可
策略2:模板的导入
使用方式
{% include 'menu.html' %}
作用:在一个模板文件中,引入/重用另外一个模板文件的内容
五、模板的继承
extends标签和block标签
实现需要在要继承的模板中,通过block划定区域
{% block 区域名字 %}
{% endblock %}
子模板中如何使用
# include有的功能extends全都有,但是extends可以搭配一个block标签,用于在继承的基础上定制新的内容
{% extends '想要继承的模板' %}
{% block 区域名字 %}
<h1>登录页面</h1>
{% endblock %}
一个页面上block块越多,页面的扩展性越高,通常情况下,都应该有三片区域
{% block content %}
{% endblock %}
{% block css %}
{% endblock %}
{% block js %}
{% endblock %}
总结与注意
#1、标签extends必须放在首行,base.html中block越多可定制性越强
#2、include仅仅只是完全引用其他模板文件,而extends却可以搭配block在引用的基础上进行扩写
#3、子模板中变量{{ block.super }} 可以重用父类的内容,然后在父类基础上增加新内容,而不是完全覆盖
#4、为了提升可读性,我们可以给标签{% endblock %} 起一个名字 。例如:
{% block content %}
...
{% endblock content %}
#5、在一个模版中不能出现重名的block标签。
六、django测试环境搭建
拷贝manage.py文件中的四行代码到tests.py文件中,再在tests.py中写两行代码
import os
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Books_Manage_System.settings")
import django
django.setup()
# 就可以在下面测试django任何的py文件
七、ORM查询关键字使用
应知应会13条方法
| 名称 | 用法 |
|---|---|
| all() | 查所有的数据,结果是Queryset对象,但是是惰性查询,要用数据的时候才去查数据显示出来,不用的话不去查 |
| filter() | 也是惰性查询,结果也是Queryset对象,需要查询条件 |
| get() | 查数据对象本身,不推荐使用 |
| order_by() | 排序,默认升序,括号里的条件加负号就是降序 |
| reverse() | 反转:前面必须是经过order_by()排序的数据才能反转 |
| exclude() | 除满足条件的数据外的所有数据 |
| values() | 括号里也要条件,结果也是Queryset对象,列表套字典 |
| values_list() | 括号里也要条件,结果也是Queryset对象,列表套元组 |
| count() | 统计数据的条数 |
| distinct() | 去重:数据必须是完全一模一样的情况下才能去重 |
| exists() | 判断数据是否存在,返回结果True或False,没有什么用 |
| first() | 拿第一个 |
| last() | 拿最后一个 |
本文详细介绍了Django框架中的模板语法,包括过滤器、标签的使用,以及如何自定义过滤器、标签和inclusion_tag。同时,讲解了模板的导入、继承,测试环境搭建和ORM查询关键字的应用,是Python后端开发者进阶的宝贵资源。
987

被折叠的 条评论
为什么被折叠?



