Django
中的模板过滤器强大又好用。当然如果你的项目是前后端分离,未用到模板,那也就不存在模板过滤器一说。
模板过滤器的作用是对从后台传进来的视图变量做一些值或格式上的改变。
Django
中自带了非常多的过滤器,基本上够我们在项目中使用。
1.
Django
中的内置过滤器
例如:add
:把add
后面的参数加给value
{{value | add : "2"}}
若value
的值为4,则输出为6.
再例如:cut
:移除value
中所有与给定参数变量相同的字符
{{value | cut:" "}}
若value
为"Hello world"
,则输出"Helloworld"
(去掉了空格)。
不过,有时候根据业务需求我们要写自己的模板过滤器,下面我们来讲一下自定义模板过滤器。
2.自定义不带参数的过滤器
我在Markdown你的文章和代码高亮也用到了此类过滤器。例如,我们来实现一个叫做my_upper
的过滤器,用来将字符串转化为大写形式(虽然Django
已经实现了——upper
)。
例如:
{{value | my_upper}}
若value
为"Hello world"
,则输出"HEELO WORLD"
具体操作:在你的应用目录下新建一个名为templatetags
的文件夹,在其内部新建__init__.py
(可为空)和custom_filter.py
这两个文件,编辑custom_filter.py
:
from django import template
register = template.Library()
@register.filter
def my_upper(value):
try:
value.upper()
except Exception, e:
return value
这样便将my_upper
这个过滤器定义好了,在使用时不要忘了在模板文件头部写入{% load custom_filter %}
。
3.自定义带参数的过滤器
其实第一部分的两个例子便为带参数的过滤器,下面我们用代码来实现一下。
@register.filter
def get_value(mydict,key_name):
assert(isinstance(mydict,dict))
try:
return mydict[key_name]
except KeyError:
return mydict
上面的代码意为以键的方式在字典中取值:
若试图函数views.py
:
def index(request):
dicts = {"key1" : 1, "key2" : 2, "key3" : 3 }
return render(request, 'index.html', {'dicts': dicts})
在模板中的使用:
{{dicts | get_value : "key1"}}
输出为1.(结束)