那么首先来说明下什么时Filter什么时tag了,如何去区分了
1、在使用上区别:
filter 使用方法{{ obj|filter:param }}
tag使用方法{% tags %}
2、filter可以使用作为if判断语句的标签,标签时不可以的
3、filter最多只能传递两个参数,而且tag可以传递多个
filter使用说明
语法的格式如下
{{ obj|filter:param }}
obj 我们需要处理的对象
filter 我们的filter,常见有如下罗列出的
param filter的参数
1、add
添加相应的值,这个比较好理解,例如:
{{ 3|add:2 }} //那么这个就是3+2最后结果等于5,当然了我们的3一般时python传过来的变量了。
注意前面的obj只能时整形数值,字符串无法相加
age|add:3
2、addslashes
给变量中的引号前加上斜线,就是转译引号,
例如:
{{"q'mm'df"|addslashes}}
那么该输出接入如下
q\'mm\'df
3、capfirst
首字目大写,很好理解不多说
例如:
{{"q'mm'df"|capfirst}}
那么输出结果如下:
Q'mm'df
4、cut
把指定的字符串剪切掉
例如我们把单引号去掉:
{{"q'mm'df"|cut:"'"}}
输出如下:
Qmmdf
5、date
格式化时间日期显示,注意了,需要处理的对象必须时时间对象类型
例如:
dt变量类容为:{{ dt }}
处理后的内容:{{ dt|date:'Y-m-d' }}
输出结果如下:
dt变量类容为:April 6, 2018, 1:07 p.m.
处理后的内容:2018-04-06
6、default
如果值是False,就替换成设置的默认值,否则就是用本来的值
例如:
{{False|default:"这是False"}}
{{True|default:"这是True"}}
输出结果如下:
这是False
True
7、default_if_none
如果值是None,就替换成设置的默认值,否则就使用本来的值,和default差不多原理
例如:
{{ None|default_if_none:"没有值默认替换" }}
{{ " "|default_if_none:"就算有一个空格也是不会替换的" }}
输入结果如下:
没有值默认替换
8、filesizeformat
对数字进行格式化,IT中经常使用到的容量显示技术
例如:
{{ "5120"|filesizeformat }}
结果就是
5.0 KB
9、first、last、slice
字符串处理,first取第一个字符,last去最后一个字符,slice切片和python中一样使用
例如:
{{ "5120"|last }}
{{ "5120"|first }}
{{ "5120"|slice:":-2" }}
结果:
0
5
51
10、safe、autoescape、striptags
让浏览器渲染我们的变量内容,
例如:
原始变量:{{ dt }}
有时候我们想浏览器去渲染我们在数据库等地方取出来的html语言:
第一种方法,也是最常用的,使用safe:
{{ dt|safe }}
第二种方法,使用autoescape off,注意了autoescape 就是标签了:
{% autoescape off%}
{{ dt }}
{% endautoescape %}
第三种方法,使用striptags,注意该方法,会去除html语言标记哦:
{{ dt|striptags }}
效果如下:
当然还有很多的filter,以上罗列出来的只是我们常用的,更多的filter请查看官方文档
https://docs.djangoproject.com/en/2.0/ref/templates/builtins/
一般常用的标签tag说明:
1、最常用的if标签 {% if %}
{% if 条件表达式 %}
表达式成立执行代码块
{% elif 条件表达式 %}
表达式成立执行代码块
{% else %}
所有表达式不成立执行代码块
{% endif %}
2、循环标签{% for %}的使用
{% for object in objects %}
执行的循环体
{% endfor %}
3、{%csrf_token%} 跨站攻击校验
请求网页时会生成一个csrf校验字符串,防止跨站请求工具,注意如果我们使用render_to_response方法,这个就不生效。
使用方法,在from表单中直接使用{% csrf_token %}
在前台我们每次请求,会随机生产一个校验码,在表单提交时后台会进行校验
4、{% url %} 链接url
显示指定路由的URL路径,具体查看上面的两个截图,我们需要在url路由指定name,前面进行调用
5、{% with %} 变量替换
例如把一个长的变量做一个短的别名
{% with total=www.qnjslm.com %}
{{ total }}
{% endwith %}
6、{% verbatim %}: 禁止进行渲染
有时候我们需要在页面上显示模板语言的原型,就会用到verbatim ,还记得上面的safe的filter
{% verbatim %}
{{ 123|add:2 }}
{% endverbatim %}
7、{% load %}加载标签库
我们使用最多的就是加载自定义标签库了,产靠下一节的演示
现在来介绍我们自定义Tag以及Filter
第一步:在APP目录下创建一个模块名字为templatetags(注意名字必须时这个)
第二步:在templatetags目录下创建py文件,这个文件名字可以随意了
第三步:创建我们自定义的filter以及tag
1、首先需要引用template,如果需要返回html内容需要引入mark_safe
from django import template
from django.utils.safestring import mark_safe
2、实例化一个对象,注意这里必须使用register 来接收,不可以使用其他名称
register = template.Library()
3、定义自已的函数,使用装饰器@register.filter、@register.simple_tag
4、在Django的设置中,在APP中一定加载我们的APP名称
5、在模板中我们使用load加载我们的文件名,就可以安装上面的方法进行使用
{% load my_test %}
详细代码(my_test):
from django import template
from django.utils.safestring import mark_safe
register = template.Library()
@register.filter
def filter_multi(v1, v2):
return v1 * v2
@register.simple_tag
def tag_multi(v1, v2, v3):
return v1 * v2 + v3
@register.simple_tag
def input_multi(id, name, class_name):
result = "" % (id, class_name, name)
return mark_safe(result)
模板中我们使用
前台的效果如下图
模板的标签(Tags):
标签的使用:{% Tags %}
autoescape
自动转义标签,要在html中原样输出html标签的时候使用
{% autoescape on %}
{{ body }}
{% endautoescape %}
对body的内容进行转义,原样输出html标签
block
模板继承,详细看模板继承
comment
多行注解,忽略、不输出{% comment %}{% endcommit %}标签里面的内容
csrf_token
防止跨站点攻击,在表单
cycle
用于循环产生字段
{% for o in some_list %}
{% cycle 'one' 'two' %}
{% endfor %}
这将会在for循环中交替出现row1和row2字符串
结果为(some_list的长度为5):
one
two
one
two
one
cycle的参数可以为字符串或者为变量
{% cycle 'one' 'two' as str %}->{{str}}
可以在循环中多次引用字符串
结果为:
one->one
two->two
one->one
two->two
one->one
debug
输出整个调试信息负载,包括当前上下文和导入的模块
extends
与block标签配合使用
filter
{% filter upper|lower %}
this is text
{% endfilter %}
将filter标签里面的经过upper处理在将结果经过lower处理,filter参数可选择多个
firstof
输出第一个不是False的参数
{% firstof var1 var2 var3 %}
等同于
{% if var1 %}
{{ var1 }}
{% elif var2 %}
{{ var2 }}
{% elif var3 %}
{{ var3 }}
{% endif %}
{% firstof var1 var2 var3 "fallback value" %}
当所有参数都为False时,输出"fallback value"
此标签自动转义默认值参数:
{% autoescape off %}
{% firstof var1 var2 var3 "fallback value" %}
{% endautoescape %}
可以使用safe管道符忽略转义:
{% firstof var1 var2|safe var3 "fallback value"|safe %}
可以用一下语法将输出值储存在变量value中:
{% firstof var1 var2 var3 as value %}
for
点运算符:
variable.object
优先返回
varialbe['object'] #字典类型查找
variable.object #属性查找
variable.object() #方法调用
variable[object] #列表索引查找
for循环设置中可用的变量
forloop.counter 循环的当前迭代(1索引)
forloop.counter0 循环的当前迭代(0索引)
forloop.revcounter 循环结束时的迭代次数(1索引)
forloop.revcounter0 循环结束时的迭代次数(0索引)
forloop.first 如果这是第一次迭代,则为真
forloop.last 如果这是最后一次迭代,则为真
forloop.parentloop 对于嵌套循环,这是上一循环的forloop对象
for....empty
配合for标签使用
{% for number in numbers %}
number
{% empty %} #numbers对象为空时执行
the numbers is empty
{% endfor %}
if
条件判断语句
{% if athlete_list %}
one
{% elif athlete_in_locker_room_list %}
two
{% else %}
three
{% endif %}
在if标签中可以使用布尔运算符or and not等
在同一标签中同时使用and 和or时and的优先级将大于or
{% if athlete_list and coach_list or cheerleader_list %}
等于
if (athlete_list and coach_list) or cheerleader_list
if标签也可以用运算符 == != < > <= >= in is
{% if a > b and b > c %}
也可以在if标签中使用过滤器
{% if messages|length >= 100 %}
You have lots of messages today!
{% endif %}
ifchanged
{% for t in text %}
{% ifchanged %}{{ t }}{% endifchanged %} #当t的内容与上次重复时,不显示出来
{%endfor%}
#也可以指定判断某个变量
{% ifchanged date.date %} {{ date.date }} {% endifchanged %}
#也可以添加{% else %}标签
{% ifchanged match.ballot_id %}
some
{% else %}
some
{% endifchanged %}
include
加载一个模板并且用当前的上下文内容渲染它。这标签能用来在一个模板中包含另一个模板,模板的名字可以是一个变量或者是字符串。
{% include "foo/bar.html" %}
模板名是相对于模板加载器的根目录的。字符串参数可以用./或者../开头。
此标签的参数也可以指定一个拥有render()方法渲染内容的Template对象。
#也可以在标签中用with指定参数
{% include "name_snippet.html" with person="Jane" greeting="Hello" %}
#可以指定字段only来指定只接受include内的参数来渲染
{% include "name_snippet.html" with greeting="Hi" only %}
load
用于装载自定义的标签或者过滤器的库
lorem
用法:
{% lorem [count] [method] [random] %}
count:用来指定要生成的段落或者单词的数目(默认为1)
method:w代表单词,p代表html段落,b代表纯文本段落
用来生成测试文本
now
用于格式化显示时间
It is {% now "jS F Y H:i" %} #可以使用反斜杠\进行转义
#也可以将输出的字符串作为变量储存下来
{% now "Y" as current_year %}
regroup
?
resetcycle
重置cycle的计数
#也可以指定重置的cycle标签
{% cycle 'one' 'two' as one %}
{% cycle 'one' 'two' as two %}
{% resetcycle one %}
spaceless
清除html标签直接的空白符号(只删除标签之间的,标签和文本之间的不删除)
{% spaceless %}
{% endspaceless %}
templatetag
用法:
{% templatetag param %}
将参数进行转义
param:
openblock ----> {%
closeblock ----> %}
openvariable ----> {{
closevariable ----> }}
openbrace----> {
closebrace----> }
opencomment----> {#
closecomment----> #}
url
用给定的名称和可选参数返回结对路径引用,任何特殊的字符都将会用iri_to_uri()编码。
语法:
{% url 'some-url-name' v1 v2 %}
#第一个参数是url的name,它可以是字符串或者变量
#额外的参数是可选的,将用作为url上的参数
#也可以使用关键词参数,但位置参数和关键词参数不要混合使用
{% url 'some-url-name' arg1=v1 arg2=v2 %}
如果指定的url不存在,则将会抛出一个NoReverseMatch错误,这将导致服务器返回一个错误页面。
#一下调用将不会直接生成url,而是会保存在变量the_url中
{% url 'some-url-name' arg arg2 as the_url %}
#可以使用标签{% block %}限定变量the_url作用的范围
verbatim
停止模板渲染引擎呈现此块标记的内容。
widthratio
按照比例计算数值
{% widthratio this_value max_value max_width %}
#可以使用as储存数值
with
简化复杂的变量调用
{% with total=business.employees.count %}
#这里可以直接使用total,total的作用域只存在标签体中
{% endwith %}
#可以指定更多的参数
{% with alpha=1 beta=2 %}
...
{% endwith %}
过滤器:
内置过滤器:
django.template.defaultfilters
过滤器改变变量的值和改变标签的参数
语法:
{{ django|title }} #将变量django内容里面的每个单词首字符转换为大写
可以向过滤器传递参数:
{{ my_date|date:"Y-m-d" }}
内建的过滤器:
add
#将参数加载变量value上
{{ value|add:"2" }}
#变量和参数也可以是其它的类型(例如string list)
addslashes
转义
{{ value|addslashes }}
#如果value是:I'm using Django
将输出:I\'m using Django
capfirst
将值的第一个字母大写
center
{{ value|center:"15" }}
#将value居中在宽度为15
cut
{{ value|cut:param }}
#将value中的全部param去掉
date
按照给定的格式去格式化日期
详细
default
当值为False时,则输出默认参数
#如果值value为False,则输出nothing
{{ value|default:"nothing" }}
default_if_none
和default类似,不过仅在值为None时才输出默认值
dictsort
将列表中的字典按照给定的参数作为字段进行排序
[
{'name': 'zed', 'age': 19},
{'name': 'amy', 'age': 22},
{'name': 'joe', 'age': 31},
]
参数为name
则输出:
[
{'name': 'amy', 'age': 22},
{'name': 'joe', 'age': 31},
{'name': 'zed', 'age': 19},
]
或者是:
{{ value|dictsort:0 }} #参数应该输入int类型,而不是字符串类型
value:
[
('a', '42'),
('c', 'string'),
('b', 'foo'),
]
排序后:
[
('a', '42'),
('b', 'foo'),
('c', 'string'),
]
dictsortreversed
工作原理和上面一样,不过是倒序排序
divisibleby
#如果value能被参数'3'整除,则输出True,否则输出False
{{ value|divisibleby:"3" }}
escape
转义,在html中输出html标签的字符串表达
escapejs
??
filesizeformat
{{ value|filesizeformat }} #将value转换为有利于理解的文件大小字符串表示
first
返回列表中的第一个元素
{{ value|first }}
floatformat
如果不带参数,则四舍五入到小数点后一位
如果带参数,则四舍五入保留参数大小的小数个数(n为参数大小)
如果参数为零,则不保留小数
如果参数为负数,则四舍五入保留参数绝对值大小的小数个数,如果小数点后全为零,则忽略小数
force_escape
类似于escape,此过滤器立即应用并返回一个新的转义字符串
get_digit
给定一个整数,返回请求的数字
{{ value|get_digit:"2" }}
#返回value的十位数字
#若参数为3,则返回百位数字
iriencode
将value转换为适合包含在URL中的字符串表达形式
join
用给定的字符串连接列表,返回最终字符串表达形式
类似python的str.join(list)
json_script
New in Django 2.1
安全地将Python对象输出为JSON,包装在
last
返回列表中最后的元素
{{ value|last }}
length
返回序列对象的长度,对于未知类型,则返回0
length_is
如果给定序列的长度等于传入的参数,则返回True,否则返回False
linebreaks
将换行符转换为
一个新行加上一个空行变成了段落换行符
linebreaksbr
将换行符转换为
linenumbers
显示文本的行数
one
two
three
转换为:
1. one
2. two
3. three
ljust
{{ value|ljust:"10" }}
#如果value是django,则输出 "Django "
lower
将给定的字符串全部转换为小写字符
make_list
将给定的字符串转换为列表
phone2numeric
将电话号码转换成数字输出
pluralize
应用于英文复数场景,参数可以定义输出的后缀
pprint
调试用??
random
随机输出给定的列表中的元素
{{ value|random }}
#如果value是['a','b','c'],则随机输出其中的一个
rjust
类似于ljust,不过对齐方式是向右
safe
标记内容,表示不用被转义
safeseq
类似于safe,但应用于列表中的每个参数
slice
给定一个列表,返回列表的切片对象
slugify
转换为ASCII。将空格转换为连字符。删除非字母数字、下划线或连字符的字符。转换为小写的。还可以去掉开头和结尾的空白。
"Joel is a slug" 转换为 "joel-is-a-slug"
stringformat
根据给定的参数格式化变量
{{ value|stringformat:"E" }}
#如果value为10,则输出1.000000E+01
striptags
将给定的字符串中的html的全部标签删除
time
格式化时间
{{ value|time:"H:i" }} #value为时间
timesince
{{ start|timesince:later }}
#代表自从start之后,到later过了多少时间
#相当于返回later-start
timeuntil
{{ start|timeuntil:before }}
#before为可选参数,代表在start之间的时间
#返回从bofore到start过了多少时间(start-before)
title
将给定的字符串中所有的单词的首字母转换为大写,其它字符转换为小写
truncatechars
缩短字符串长度为给定的参数,缩短后字符串带...后缀
{{ value|truncatechars:9 }}
#value="Joel is a slug"
#输出"Joel i..."
truncatechars_html
类似truncatechars,但忽略html标签,将标签里面的内容自动缩短。
{{ value|truncatechars_html:9 }}
#value=" Joel is a slug
#输出" Joel i...
truncatewords
类似truncatechars,但以一个单词为单位计算。
truncatewords_html
类似truncatechars_html,但以一个单词为单位计算。
unordered_list
根据给定的嵌套的list自动生成嵌套的列表
upper
将给定的字符串中的字母全部转换为大写字母
urlencode
转义URL中使用的值
urlize
将给定的url地址转换为html中可点击的链接
urlizetrunc
类似于urlize和truncatechars的结合体
wordcount
返回给定字符串中单词的数量
wordwrap
指定每行的长度
{{ value|wordwrap:5 }}
#如果value为"Joel is a slug"
#则输出
Joel
is a
slug
yesno
将给定值的布尔值转换为自定义的参数
{{ value|yesno:"yeah,no,maybe" }}
#如果value为True,则输出yeah
#如果为False,则输出no
#如果为None,则输出maybe(此参数可省略,如果省略,则默认输出False对应的结果)