Django自定义模板过滤器(register.filter)
django的模板语言中有自带的过滤器,但是有时候你会觉得这些自带的过滤器不够用,这时你可以通过使用Python定义自定义标记和过滤器来扩展模板引擎,然后使用标记将它们提供给模板。
代码布局
- 需要先在你的app包下面创一个templatetags包(init.py)
- 然后在这个包里就可以创建你的自定义标记/过滤器文件夹(模块文件的名称是您稍后用于加载标记的名称,因此请谨慎选择不会与其他应用程序中的自定义标记和过滤器冲突的名称。),比如:mytag.py
- 接着写完你的自定义过滤器方法后要在模板里导入你的这个文件
{% load mytag.py %}
(这意味着在改模板下加载mytag.py)
编写你的过滤器
- 首先需要导入template(注意不是你的模板文件夹,而是django自带的template模块),这里需要注册一个
template.Library
实例,使你的过滤器可以生效,
在mytag.py顶部输入:
from django import template
register = template.Library()
- 自定义的过滤器就是一些有一到两个参数的Python的函数
1>(输入的)变量的值,不一定得是字符串类型
2> 而参数的值,它们可以有一个默认值,或者被排除在外
比如现在写一个过滤器:
def cut(value, arg):
"""
这个过滤器是将渲染的value值中的arg替换空''
"""
return value.replace(arg, '')
模板html里应该:
{{ somevariable|cut:"0" }} # 这里是调用cut这个过滤器将后台传过来的变量中的'0'转化为空
注:这时你自己编写的过滤器还不能在模板中生效,需要标记一下
这时刚刚上面的register将有用
@register.filter(name='cut')
# 如果你省略了name参数,就像上面的第二个例子一样,Django将使用函数的名称作为过滤器名称。
def cut(value, arg):
return value.replace(arg, '')
如果担心后台传过来的变量不是一个字符串而是以个整数的话(因为整数会导致AttributeError),这时则应使用装饰器stringfilter
from django import template
from django.template.defaultfilters import stringfilter
register = template.Library()
@register.filter
@stringfilter #这将在传递给您的函数之前将对象转换为其字符串值
def cut(value, arg):
return value.replace(arg, '')
后面将会有register.simple_tag