现在我们已经很熟悉Django的MTV模式了。模板(template)负责如何去展示数据,而视图(view)负责筛选出正确的数据。因此通常来说逻辑都是放到视图中的,但模板也需要一些和表示相关的逻辑:比如循环展示(如{% for ... %}
)、或者以某种特定格式输出(如{
{ ...|date:'Y-m-d' }}
)等,这些功能都是靠模板的**过滤器(filters)和标签(tags)**实现的。
Django的模板语言包含了很多内置的过滤器和标签,设计目的是满足应用需要占位逻辑需求。但有的时候这些通用的功能满足不了你的某些需求,这时候就需要自定义过滤器和标签来实现了。
前置条件
要在Django中使用模板过滤器或标签,就首先得注册它们。
注册方法如下:
- 在APP中新建名为
templatetags
的目录(方便起见,教程选择了article
这个APP) - 在此目录中新建名为
__init__.py
的空文件,使得此目录被视作一个Python的包 - 在此目录中新建python文件(比如
my_filters_and_tags.py
),就可以在里面愉快的写代码啦
完成后的目录结构如下:
article/
__init__.py
views.py
models.py
# 新增目录
templatetags/
__init__.py # 空文件
my_filters_and_tags.py # 即将写代码的地方
...
请注意:
- 目录必须位于已注册的APP中,这是出于安全性的考虑
- 新建目录后,必须手动重启服务器,里面的过滤器和标签才能生效
前置条件就完成了,接下来我们看看如何写一个模板过滤器。
模板过滤器
过滤器filter
的表现形式为紧跟在上下文后面的管道符|
,管道符后面是filter的名称:{
{ ...|filter_name }}
。有的filter还可以带有参数:{
{ ...|filter_name:var }}
。
注意过滤器名称的冒号后面不能有空格。
filter
这个名字可能会让你误认为它只是用来筛选某些特定数据的,但实际上它远不止这点功能。它可以改变上下文的最终展示效果,也可以将上下文通过运算输出为特定的值。
小试牛刀
要成为一个可用的filter
,文件中必须包含一个名为 register
的模块级变量,它是一个 template.Library
实例,所有的filters
均在其中注册。所以在my_filter_and_tags.py
文件中输入以下内容:
article/templatetags/my_filter_and_tags.py
from django import template
register = template.Library()
接下来就可以像写普通的Python函数一样写过滤器了:
article/templatetags/my_filter_and_tags.py
from django import template
register = template.Library()
@register.filter(name='transfer')
def transfer(value, arg):
"""将输出强制转换为字符串 arg """
return arg
@register.filter()
def lower(value):
"""将字符串转换为小写字符"""
return value.lower(