Django模板语言-2:simple_tag和filter
标签simple_tag:
标签:在HTML中使用{% %}标记
常见的系统内自带的标签:load、for 、if、with、csrf_token、verbatim、
block-endblock\extends\comment-endcomment\cycle(silent)\自定义标签
1、with:
在html里给变量赋值
{% with name=obj.group.name%} # 用于长变量赋值{{name}} # 直接调ip,显示host.name.ip的值
2、csrf_token:
之前在使用form表单时,提示Forbidden:CSRF verification failed. Request aborted,
解决方法1、在settings里注释掉中间件CSRF
解决方法2、在form表单里添加csrf_token标签
<form action="checkuser/" method="post"><input type="text" name="username" placeholder="用户名" /><input type="text" name="password" placeholder="密码" /><input type="submit" value="登 陆" />{% csrf_token %} {#使用此句,无需注释掉中间件的CSRF#} </form>
3、verbatim
取消渲染模板标记,以文字显示verbatim里面的内容
{% verbatim %} {{ for i in [1,2,3,4] }} {{ i }} {{ endfor }}{% endverbatim %}网页显示结果: {{ for i in [1,2,3,4] }} {{ i }} {{ endfor }}
4、autoescape、识别、不识别含有html标签的字符串,默认不识别html标签,与过滤器safe,django的mark_safe作用一样
参数:on、off,默认on
html_str = "<a href='f-t'>点我</a>"{% autoescape off %} {{ html_str }}{% endautoescape %}# 结果:点我{% autoescape off %} {{ html_str }}{% endautoescape %}# 结果:<a href='f-t'>点我</a>
5、comment注释
{% comment %} 此段内容不显示在网页上{% endcomment %}
6、cycle,循环迭代,重复1到4,遇到resetcycle,重新从1开始,silent使用上一个值
{% cycle '1' '2' '3' '4' as num%}{% cycle num %}{% cycle num silent %} # 重复输出2{% resetcycle %}{% cycle num %}{% cycle num %}{% cycle num %}{% cycle num %}# 应用场景:隔行变色{% for i in list%}<tr class={% cycle 'blue' 'red' %}>lala</tr>{%endfor%}
7、debug输入调试信息
{% debug %}
8、firstof 输入参数中,第一个不为空或false的参数
{% firstof da 'e' 'f' %}# 因为da是未定义的变量名,结果: 'e'
9、自定义simple_tag:
3固定原则:在APP中新建包名是固定:templatetags
在views中,Library实例化名字固定:register=template.Library()
自定义函数,使用register.simple_tag装饰
使用:在HTML上方{% load 定义的python文件%}
# 在templatetags下新建python文件,custom_tag.py# 导入templatefrom django import template# 实例化register = template.Library() # register固定,不可变为其它名@register.simple_tag # 装饰daxiedef daxie(str1): # 把字符串变成大写。 str1 = str(str1).upper() return str1
# 在HTML中上方载入自定义的python文件{% load custom_tag %}{% daxie 'WERWERFSEFkjdDFGSdfeflnnidhggindSDGSEGSFVBNHR' %}# 参数直接写在simple_tag名字的后面,可以有多个#结果#WERWERFSEFKJDDFGSDFEFLNNIDHGGINDSDGSEGSFVBNHR
过滤器filter:
支持链式操作,每个结果都依次传入下个|的过滤器
过滤器调用格式{{ 值|过滤器名1:参数1|过滤器名2:参数2|...........}}
说明:
值:只能传一个
管道符|:左右都不能带空格
过滤器名:函数名
:左右也不能带空格
参数:也只能传一个,多个值可以使用加引号的字典或列表,"{'name':'david','age':19}"
1、内置过滤器有30个:add\default\length\filesizeformat\slice\date\safe\truncatechars\truncatewords\cut\join\add\urlencode
# add 前值加{{ 30|add:' 1'|add:' 3'|add:' 2'|add:' 4'|add:' 5' }} # 多个|每次传递前面的值# 结果:sq 1 3 2 4 5# urlencode还记得javascript地址转换吗,一样样的{{ "http://127.0.0.1:8000/a/test/666"|urlencode }}结果:http%3A//127.0.0.1%3A8000/a/test/666<br># join 使用指定字符连接列表或字符# views传入{'ls':[122,111,555]}{{ ls|join:'@' }}结果:122@111@555{{ '1 2232'|join:'-' }}结果:1- - - - -2-2-3-2<br># cut 从字符串中删除指定字符串{{ '1112312312311221313'|cut:'23' }}结果:1111111221313<br># truncatechars从第n个字符删除{{ '1234567890'|truncatechars:2 }}结果:1...<br># truncatewords 以空格计算单词个数,保留n个单词{{ '123 456 78 90'|truncatewords:2 }}结果:123 456 …<br># safe变量值是安全的,使HTML字符串转义,link = "<p><a href='http://127.0.0.1:8000/a/test/666'>超链接</a> </p>"{{ link }}{#结果:<p><a href='http://127.0.0.1:8000/a/test/666'>超链接</a> </p>#}{{ link|safe }}结果:超链接<br># date 格式化日期,传入的是datetime.datetime.now(){{ dt|date:"Y-m-d H:i:s" }}# 结果:2019-10-11 14:58:16{{ dt|date }}# 结果:Oct. 11, 2019<br># slice切片:{{ '0123456'|slice:"0:3" }}# 结果:0123<br># filesizeformat,将数值转换为计算机单位{{ 1000|filesizeformat }} # 1000 bytes{{ 10000|filesizeformat }} # 9.8 KB{{ 1000000000|filesizeformat }} # 953.7 MB<br># default 如果前面的变量为空或不存在,显示默认值,不改变sname的值{{ sname|default:'none' }}# 结果: none<br># length 返回长度{{ 'abc'|length }}
2、自定义filter:
定义方式与simple_tag一样,调用方式不一样。
4固定原则:在APP中新建包名是固定:templatetags
在views中,Library实例化名字固定:register=template.Library()
HTML里调用格式固定
自定义函数,使用register.filter装饰
只能使用两个值,通常一个是修饰前,一个是修饰参数
使用:在HTML上方{% load 定义的python文件%}
调用:使用{{}}调用 ,格式:{{ str|filtername:args }}
# 在templatetags下新建python文件,custom_filter.pyfrom django import template # 导入template模块register = template.Library() # 实例化,名字必须是register@register.filterdef filter_ellipsis(str1, args1): # 最多两个参数 # 把str1截取args1长度并加...返回给前端 if len(str1) > args1: str1 = str1[:args1] + r"..." return str1
在HTML中上方载入自定义的python文件
{% load custom_tag %}{{ "01234567890123456789012345678901234567890123456789"|filter_ellipsis:20 }}# 结果:01234567890123456789...
Filter与simple_tag区别:
1、HTML标记不一样,filter使用{{}},tag使用{%%}
2、filter可以在if/for里用于条件判断,tag不可以
3、filter最多传两个参数,tag可以多个
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。