自定义的标签tag和filter,必须要放在已经在settings.py中INSTALLED_APP里面注册了的app下。
假设app是polls
首先,在polls目录下建立templatetags目录,结构如下:
polls/
__init__.py
models.py
templatetags/
__init__.py # 包含了__init__.py的才会被django认作是文件夹
polls_extras.py
views.py
在模板中使用标签时要{% load polls_extras.py %}
现在可以在polls_extras.py中定义我们自己的tag和filter了
# polls_extras.py
from django import template
# 为了可以成为在库(Liberary)中有效的标签,module模块中(polls_extras.py)必须包含一个template.Library的实例变量register
# 编写自定义的filter
def cut(value, arg):
return value.replace(arg, '')
# 这样在模板中{
{variable|cut:'test string'}}即将变量variable用cut来过滤,将variable中的'test string'剔除掉(变成了空字符串)# 大多数的filter没有参数
def lower(value):
return value.lower()
# 编写完自定义的filter,接下来就要注册(register)这些filter了
register方式一:
register.filter('cut', cut)
register.filter('lower', lower)
register方式二: 将register.filter当成装饰器来用
@register.filter(name='cut')
def cut(value, arg):
return value.replace(arg, '')
@register.filter # 如果注明了name='xx'则filter名字为xx,如果没有给name参数,则默认filter名字是方法的名字
def lower(value):
return value.lower()
@register.filter(is_safe=True) # is_safe=True可以过滤掉不安全的HTML characters(<,>,',",&),当在value基础上再家字符串时也需要用到is_safe
def add_xx(value):
return "%sxx" % value
from django.utils import timezone
@register.filter # 对时间对象进行处理
def utc2local(times):
return timezone.localtime(timezone.make_aware(times, timezone.utc).strftime("%Y-%m-%d %H:%M:%S"))
@register.filter
def number(value): # 对浮点数进行处理
if isinstance(value, float):
return "%g" % value
return value
# 自定义标签
import datetime
@register.assignment_tag
def current_time(format_string):
return datetime.datetime.now().strftime(format_string)
# 在模板中: {% current_time "%Y-%m-%d %I:%M %p" as the_time %}
<p>the time is {
{ the_time }}.</p>