自定義的標籤tag和filter,必需要放在已經在settings.py中INSTALLED_APP裏面註冊了的app下。django
假設app是polls
安全
首先,在polls目錄下創建templatetags目錄,結構以下:app
polls/orm
__init__.py對象
models.py字符串
templatetags/string
__init__.py # 包含了__init__.py的纔會被django認做是文件夾
it
polls_extras.py
form
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>