通过管道符连接后面的方法,我们就可以在前端展示我们想要的数据
{{ time | date:"Y-m-d H:i:s"}} #将日期以年月日时分秒的形式显示
{{ name | truncatewords:"10" }} #截取前10个字符
{{ name | first | upper}} #第一个字大写
{{ name | lower}} #全部小写
{{ data | add:2}} #使data加2后输出
{{ date|default:5 }} #若date没有数据则使用默认值5
示例:
#Django01_app02/views.pyclass PersonList(ListView): model = Person template_name = 'Django01_app02/filter_tag.html' def get_context_data(self, **kwargs): return {'data': '20','time':datetime.datetime.now()}
{% load mytag01 %}
当然了上面方面都是固定用法,在开发中我们通常会自定义这些函数。
在app目录下创建templatetags子目录,并在里面创建两个文件,__init__.py,用来声明这是一个包,另一个是你的tag/filter定义文件。比如myNewLibrary.py,那么在模板文件中可以这样使用:{% load myNewLibrary %}
然后我们可以在目录下创建一个py文件,例:mytag01.py
在我们的views文件里给context的字典里添加两个列表数据以便备用
#Django01_app02/views.pyclass PersonList(ListView): model = Person template_name = 'Django01_app02/filter_tag.html' def get_context_data(self, *, object_list=None, **kwargs): context=super().get_context_data(object_list=object_list,**kwargs) context.update({'lst01':[1.12,2.123,3.1234,4.12345],'lst02':[1,2,3,4]}) return context
编写mytag01.py
自定义的过滤器就是一个带1,2个参数的python函数,一个参数放变量值,一个用来放选项值
from functools import reducefrom django import templateregister = template.Library()@register.filter(is_safe=False) #自定义fliter要注册装饰器一般默认在括号内填写is_safe=Falsedef add_filter(value, rounded=5): #filter只有两个参数,第一个是类型,第二个可以根据需要填写 assert isinstance(value, list) #这里我们判断是否为列表类型否则不执行此后程序 return round(sum(value), rounded) #返回列表内数字之和并保留5位小数@register.simple_tag #自定义tag也需要注册,默认使用simple_tagdef add_tag(*args, **kwargs): args=args[1]+args[0] #需要指定传入的参数 assert isinstance(args, list) #依旧判断是否为列表类型 result = reduce(lambda x, y: x + y, args) #累加,也可以用result=sum(args) rounded = kwargs.get('rounded') #判断是否有保留位数 rounded = rounded or 5 #无保留小数则使用默认值5 result =round(result,rounded) return result
html文件:
{% load mytag01 %}
然后代码完成后运行程序可以得到如下结果:
可以发现自定义tilter和tag分别实现了将列表内数字相加的功能,两者不同的是,自定义的tag被传入了两个列表参数且把两个参数分别求和再相加。