Django——模板&过滤器
模板,指在Django中,后端将数据发送至前端后,在前端中进行数据的提取所进行的操作。
后端数据发送
- 将后端信息,以字典形式进行前端的发送。
- 使用render返回html文件的同时,发送已经设置的数据。
- 不是将所有文件都发送给html,然后再通过html进行替换,而是,在python后台将数据替换完成后,发送给html,然后html再进行显示。
#后台将数据发送给前端
def login(request):
#从数据库获取数据信息
all_list = models.User.objects.all()
#返回给login.html文件
return render(request, 'login.html',{'all_list':all_list})
前端数据获取
逻辑
-
for循环
- 用来进行逻辑信息的提取
- 可使用for等其他逻辑、判断语句
- 一般都会配合变量信息一起使用,先进行循环,后进行可展示信息展示。
- 必须要有结束语句,否则会显示错误。
使用ORM来获取数据库信息,并将信息返回给html文件中。
{% for list in all_list %} #用于逻辑信息提取
<div>
<span>{{list.id}} </span> #用于变量信息,可以使用list.kp来代替
<span>{{list.username}}</span> #用于变量信息
</div>
{% endfor %} #结束语句
-
判断
- 用来进行对匹配数据进行判断
- 判断匹配后,显示内容信息
- 所支持的and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。
- 可以写在单独一个标签中,也可以写在一个语句当中
{% for list in all_list %}
<div>
{% if 1=1 %}
<span>{{list.username}}</span>
{% endif %}
</div>
{% endfor %} #结束语句
<div class= top {% if 1=1 %} left {% endif %}></div> //在添加判断,符合条件后增加该属性。
-
csrf_token
- 这个标签用于跨站请求伪造保护。
- 写上标记以后,发送post请求,会附带一个name=csrfmiddlewaretoken,vlaue=随机数字的一个请求
{% csrf_token %} #在页面的form表单里面写上
变量
- 可直接用于展示的信息。
- 当使用位置提取时,不支持负值。
- 使用字典提取时,可以使用.keys
- 使用class时,无法使用传参形式进行。
- 遇到(.)时,有一个查找顺序,1.字典 2.属性或方法3. 数字索引
- 如果放入一个不存在的值,将不会报错,但不会显示
{{all_list}} #可以直接获取数据内的所有内容
{{ all_list.name }}
#可以指定获取内容,这里的.name是替换字典all_list['name']形式获取,也可以使用gets、values、items进行提取,不需要加括号。
#可以应用class中的函数,不可使用传参。
{{ all_list.1 }} #获取以列表、字符串、元组、形式进行位置提取all_list[1]的形式的提取。
-
with
- 将所需要的内容进行赋值
- 只能适用于其变量内部,超出不生效
- 如果使用=号进行赋值,那么就要注意=号两边的空格不能有
{% with books.name as 书名 %} = {% with 书名=books.name %}
{{ 书名 }}
{{ 书名 }}
{{ 书名 }}
{{ 书名 }}
{% endwith %}
内置属性
在使用信息时,有内置的属性可以使用
-
xxx.pk
- primary key的缩写,因为提取的是整个表结构,所以可以将设置 好的主键进行提取。
<span>{{list.pk}}</span>
-
get_xxx_display
应用于选项时使用,将直接显示对应的value值。
sex_type =(('male','男'),('female','女'))
sex = models.CharField('性别',choices=sex_type,default='male') #将多个选项单独创建,再导入类中进行选项的选择。
{% for i in all_list %}
{{ i.get_sex_display }} #获取对应的sex的名称,是男或女。默认是male或female
-
forloop
- 在for循环中使用
- 进行计数使用
- 可用来替换id的编写
<span>{{forloop}} </span>
-
forloop.counter
- 用于计数,每循环一次,将数值增加1
- 从1开始计数
<span>{{forloop.counter}} </span>
-
forloop.last
- 可用于判断语句
- 判断值是否为最后一个,是为True
<span>
{% for i in all %}
{% if forloop.last %}
1
{% else %}
2
{% endif %}
{% endfor %}
</span>
-
forloop.first
- 可用于判断语句
- 判断值是否为第一个,是为True
<span>
{% for i in all %}
{% if forloop.first %}
1
{% else %}
2
{% endif %}
{% endfor %}
</span>
-
forloop.parentloop
- 查询父循环的内容,如果有就将信息填写,如果没有就为空
- 双层循环时,需要用到父循环内容可使用
{% for i in boos %}
{% for book in i %}
<span>{{ forloop.parentloop }}</span>
{% endfor %}
{% endfor %}
-
empty
- 将没有获取到数据的for循环显示该内数据
{% for i in boos %}
{% for book in i %}
<span>{{ forloop.parentloop }}</span>
{% empty %}
<span>无法提取相关数据</span>
{% endfor %}
{% endfor %}
内置过滤器
- 用来显示变量的显示结果
- 如果有 :时,左右两边不能有空格
语法: {{ value|filter_name:参数 }}
-
default
- 如果无法找到相对应的value值,那么就会显示默认nothing。
- value值只要有值,不管是空值或者None,都会显示。
{{ value|default:"nothing"}}
或者可以通过TEMPLATES的OPTIONS增加一个选项:string_if_invalid:'找不到',可以替代default的的作用。
-
filesizeformat
-
将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)
- 只要是数值就行,会自动将其转换成文件尺寸
- 最大尺寸为PB,在往上就会定格在PB
-
add
- 将vlaue值与设置的值进行相加
{{ 2|add:"2" }} #得出来4
{{ '2'|add:"2" }} #得出来4
{{ '2'|add:"abc" }} #得出来2abc
{{ [1,2,3]|add:[4,5,6] }} #得出来1,2,3,4,5,6
-
lower
小写
{{ value|lower }}
-
upper
大写
{{ value|upper}}
-
title
标题
{{ value|title }}
-
ljust
左对齐
"{{ value|ljust:"10" }}"
-
rjust
右对齐
"{{ value|rjust:"10" }}"
-
center
居中
"{{ value|center:"15" }}"
-
length
返回value的长度,如 value=['a', 'b', 'c', 'd']的话,就显示4.
{{ value|length }}
- slice
- 切片,跟列表的切片功能一样
- 对字符串、列表有作用
- 可以倒取
{{value|slice:"2:-1"}}
-
first
取第一个元素
{{ value|first }}
-
last
取最后一个元素
{{ value|last }}
-
join
使用字符串拼接列表。同python的str.join(list)。
{{ value|join:" // " }}
-
truncatechars
- 如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。
- 实例截取是前6个字符,后三个是。。。
参数:截断的字符数
{{ value|truncatechars:9}}
-
truncatewords
- 对单词进行截取,只支持英文
- 实例截取8个单词字段,最后留给。。。
{{ value|truncatewords:9}}
-
divisibleby
- 除尽,一般用于进行判断使用
{% if value|divisibleby:2%}
-
date
- 日期格式化
- 可格式化输出的字符:点击查看
- 也可以在settings中配置USE_L10N= False, 在下方添加DATETIME_FORMAT = 'Y-m-d H:i:s' 直接将所有的时间格式全部应用。后续直接写value即可。
{{ value|date:"Y-m-d H:i:s"}} #显示的是年-月-日 时:分:秒
-
safe
Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,防止XSS攻击。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。
1. 直接在html文件中设置转义
比如:
value = "<a href='#'>点我</a>"
{{ value|safe}}
2. 在自定义过滤器的装饰器上进行设置转义
@register.filter(is_safe=True)
def add_xx(value,age):
return f"{value,age}"
3. 导入mark_safe的模块进行自定义过滤器的转义
from django.utils.safestring import mark_safe
@register.filter
def add_xx(value,age):
return mark_safe(f"{value,age}")
自定义过滤器
1. 在APP下,创建一个名为templatetags的python包
2. 在python中创建py文件,文件名自定义即可
3. 在python文件中,需要写入
from django import template
register = template.Library()
4. 写需要的函数或者类
必须要带value,将需要处理的值导入进来。
info可有可无看需求。
最多可带有两个参数。
@register.filter
def add_xx(value,age):
return f"{value,age}"
5. 在html中,使用自定义模板
{% load my_file %}
{{ 'zhao'|add_xx:22 }}
自定义simpletag
和自定义filter类似,只不过接收更灵活的参数。
定义注册simple tag
@register.simple_tag(name="plus")
def plus(a, b, c):
return "{} + {} + {}".format(a, b, c)
使用自定义simple tag
{% load app01_demo %}
{# simple tag #}
{% plus "1" "2" "abc" %}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)