django 自定义tag和filter

自定义的标签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

 

register = template.Library()

# 编写自定义的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>

 

posted @ 2015-10-23 12:34  lixiaodi  阅读(808)  评论(0编辑  收藏  举报