默认filter
通过管道符连接后面的方法,我们就可以在前端展示我们想要的数据
{{ 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.py
class 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 %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ data|add:2 }}
{{ date|default:5 }}
{{ time|date:"Y-m-d H:i:s" }}
</body>
</html>
当然了上面方面都是固定用法,在开发中我们通常会自定义这些函数。
在app目录下创建templatetags子目录,并在里面创建两个文件,__init__.py,用来声明这是一个包,另一个是你的tag/filter定义文件。比如myNewLibrary.py,那么在模板文件中可以这样使用:{% load myNewLibrary %}
然后我们可以在目录下创建一个py文件,例:mytag01.py
在我们的views文件里给context的字典里添加两个列表数据以便备用
#Django01_app02/views.py
class 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 reduce
from django import template
register = template.Library()
@register.filter(is_safe=False) #自定义fliter要注册装饰器一般默认在括号内填写is_safe=False
def add_filter(value, rounded=5): #filter只有两个参数,第一个是类型,第二个可以根据需要填写
assert isinstance(value, list) #这里我们判断是否为列表类型否则不执行此后程序
return round(sum(value), rounded) #返回列表内数字之和并保留5位小数
@register.simple_tag #自定义tag也需要注册,默认使用simple_tag
def 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 %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ lst01|add_filter }} #自定义tilter
{% add_tag lst01 lst02 %} #自定义simple_tag
</body>
</html>
然后代码完成后运行程序可以得到如下结果:
?可以发现自定义tilter和tag分别实现了将列表内数字相加的功能,两者不同的是,自定义的tag被传入了两个列表参数且把两个参数分别求和再相加。
|