在Django的模板语言中,通过使用 过滤器 来改变变量的显示。
过滤器: 管道符 左侧当做过滤器的第一个参数 右侧有时候还可以支持再传一个参数(冒号开头)
过滤器的语法: {{ value|filter_name:参数 }}
使用管道符"|"来应用过滤器。
例如:{{ name|lower }}会将name变量应用lower过滤器之后再显示它的值。lower在这里的作用是将文本全都变成小写。
注意事项:
{{ sss|truncatewords:30 }},这将显示sss的前30个词。{{ list|join:', ' }}|左右没有空格没有空格没有空格:{{ l|length }}{{ i|add:123 }}、拼接操作:{{ s|add:'去你妹的' }}{{ ctime }}、{{ ctime|date:'Y-m-d' }}{{ file_size|filesizeformat }}将整数类型的数字转换成 KB, MB, GB…
{{ desc|truncatechars:6 }}将一串字符从头开始截取,识别字符, 但是最后一定为留三个字符的位置存储三个点
...
{{ desc|truncatewords:3 }}将一串字符从头开始截取,识别单词(按照空格识别), 最后会显示三个点
...,但是这三个点不会占据位置
切片操作:{{ s|slice:'0:4' }}
默认值(判断布尔值):{{ b|default:'这个东西布尔值是False' }}
当前面的参数为
True时,则结果显示为True;当前面的参数为
False时,则结果显示为:后面定义的参数这个东西布尔值是False;
{{ value|safe }}Django的模板会对HTML标签、JS等语法标签进行自动转义;
例如
value="<script>alert(123)</script>",模板变量{{ value }}会被渲染成<script>alert(123)</script> 交给浏览器后会被解析成普通字符'<script>alert(123)</script>',失去了js代码的语法意义需要将变量
{{ value }}变成{{ value|safe }}拓展:后端有个模块也可以做到自动转义的功能
from django.utils.safestring import mark_safe ht1 = '<h1>一级标题</h1>' ht1 = mark_safe(ht1) return render(request, 'test.html', {'ht1':ht1})
- 1
- 2
- 3
- 4
- 5
在前端就可以直接通过
{{ ht1 }}渲染出一级标题的效果,而不是字符串
在前端模板文件中,只需要输入
for然后按table键就能够自动补全
#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 %}
forloop参数其实就是一个字典,字典中有以下参数:
forloop.counter 当前循环的索引值(从1开始)
forloop.counter0 当前循环的索引值(从0开始)
forloop.revcounter 当前循环的倒序索引值(从1开始)
forloop.revcounter0 当前循环的倒序索引值(从0开始)
forloop.first 当前循环是第一次循环则返回True,否则返回False
forloop.last 当前循环是最后一次循环则返回True,否则返回False
forloop.parentloop 本层循环的外层循环
for标签可以带有一个可选的{% empty %} 从句,在变量person_list为空或者没有被找到时,则执行empty子句
{% for person in person_list %}
<p>{{ person.name }}</p>
{% empty %}
<p>sorry,no person here</p>
{% endfor %}
{% if 条件 %}条件为真时if的子句才会生效,条件也可以是一个变量,if会对变量进行求值,在变量值为空、或者视图没有为其传值的情况下均为False
if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。
{% if num > 100 or num < 0 %}
<p>无效</p>
{% elif num > 80 and num < 100 %}
<p>优秀</p>
{% else %}
<p>凑活吧</p>
{% endif %}
with标签用来为一个复杂的变量名起别名,如果变量的值来自于数据库,在起别名后只需要使用别名即可,无需每次都向数据库发送请求来重新获取变量的值
注意:起别名的变量不能在别的语句中使用!!!
{% with li.1.upper as v %}
{{ v }}
{% endwith %}
当内置的过滤器或标签无法满足我们需求时,我们可以自定义,具体操作步骤如下
1、在settings.py中的INSTALLED_APPS添加当前app的名字,不然django无法找到自定义的过滤器或标签
# 在settings.py中找到该列表,然后加以配置
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config',
'app01', # 添加当前app的名字
]
2、在文件夹app01中创建子文件夹templatetags(文件夹名只能是templatetags)
3、在templatetags新建任意.py文件,如my_tags.py,在该文件中自定义过滤器或标签,文件内容如下
from django import template
register = template.Library() # 注意变量名必须为register,不可改变
#1、自定义过滤器
@register.filter
def my_multi_filter(v1 ,v2): # 自定义的过滤器只能定义最多两个参数,针对{{ value1 | filter_multi:value2 }},参数传递为v1=value1,v2=value2
return v1 * v2
#2、自定义标签
@register.simple_tag
def my_multi_tag(v1, v2): # 自定义的标签可以定义多个参数
return v1 * v2
#3、自定义标签扩展之mark_safe
# 注释:我们可以用内置的标签safe来让标签内容有语法意义,如果我们想让自定义标签处理的结果也有语法意义,则不能使用内置标签safe了,需要使用mark_safe,可以实现与内置标签safe同样的功能
from django.utils.safestring import mark_safe
@register.simple_tag
def my_input_tag(id, name):
res = "<input type='text' id='%s' name='%s' />" % (id, name)
return mark_safe(res)
4、自定义过滤器或标签必须重新启动django方可生效
5、自定义过滤器或标签的使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--必须先加载存有自定义过滤器和标签的文件-->
{% load my_tags %}
<!--salary的值为10,经过滤器my_multi_filter的处理结果为120-->
{{ salary|my_multi_filter:12 }}
<!--结果为2-->
{% my_multi_tag 1 2 %}
<!--
结果为一个input标签,该表的属性id="inp1" name="username"
注意:input的属性值均为字符串类型,所以my_input_tag后的两个值均为字符串类型
-->
{% my_input_tag "inp1" "username" %}
</body>
</html>