前提:自定义模板标签和过滤器必须位于Django的某个应用中,这个应用可以包含一个templatetags目录, 和models.py views.py 处于同一级目录。若这个templatetags目录不存在则创建他,同时在该目录下建立一个py文件:__init__.py 文件,使得该目录可以作为Python包。在添加这个模块后,需要重启服务器以便使用。注意命名不要冲突。eg:
polls/ __init__.py models.py templatetags/ 在模板中可以这样用:{% load poll_extras %}
__init__.py
poll_extras.py
views.py
一.自定义过滤器
自定义过滤器就是一个带有一个或两个参数的python函数:
>变量值:不一定为字符串形式。(此参数为输入)
>参数值:可以有初始值。(此参数可不要)
def cut(value, arg): # value为变量, arg为参数
return value.replace(arg, '') # 此过滤器实现将变量value中的arg全部替换为‘ ’
使用该过滤器的方法: {{ somevariable | cut:"0" }}
def lower(value): # 只有变量,没有参数,大多数过滤器无参数
return value.lower() # 此过滤器实现将变量value变为小写
写完过滤器函数后可以需要进行注册才可以以使用:
register.filter('cut', cut) # Library.filter()有两个参数,过滤器名称,编译的函数
register.filter('lower', lower)
还可以把register.filter()用作装饰器,更简洁:
@register.filter(name='cut') #过滤器名字为cut
def cut(value, arg):
return value.replace(arg, '')
@register.filter
def lower(value):
return value.lower()
特别的,如果这将在对象被传入你的函数之前把这个对象转换成它的字符串值:
from django import template
from django.template.defaultfilters import stringfilter
register = template.Library()
@register.filter
@stringfilter
def lower(value):
return value.lower() # 传递整数也不会出现AttributeError (因为整数没有 lower()方法).
二.自定义模板标签
1.简单的标签 :django.template.Library.simple_tag()
simple_tag。eg:
import datetime
from django import template
register = template.Library()
@register.simple_tag
def current_time(format_string):
return datetime.datetime.now().strftime(format_string)
如果你的模板标签需要访问上下文,可在注册标签时使用takes_context参数:
@register.simple_tag(takes_context=True) def current_time(context, format_string): timezone = context['timezone'] return your_get_current_time_method(timezone, format_string)