Django的模板系統自帶了一系列的內建標籤和過濾器,通常狀況下能夠知足開發要求,若是以爲需更精準的模板標籤或者過濾器,能夠本身編寫模板標籤和過濾器,而後使用{% load %}標籤使用他們。最好是查看Django的文檔:自定義模板標籤和過濾器,這裏僅僅簡單的敘述一下,大部分仍是參考官方文檔。python
自定義過濾器django
1.代碼佈局
自定義標籤和過濾器必須依賴於一個django app,也就是說,自定義標籤和過濾器是綁定app的。該app應該包含一個templatetags目錄,這個目錄應該和model.py,views.py在同一個層級,記得在該目錄下創建一個__init__.py文件一遍django知道這是一個python包。在該目錄下,你能夠新建一個python模塊文件,文件名不要和其餘app中的衝突就好。例如:app
polls/ models.py templatetags/ __init__.py poll_extras.py views.py
而後在你的模板文件中你能夠這樣使用你的自定義標籤和過濾器:函數
{% load poll_extras %}
注意事項:
包含templatetags目錄的app必定要在INSTALLED_APPS列表裏面
{% load %}load的是模塊名,而不是app名
記得要引入template模塊,建立一個register對象佈局
from django import template register=template.Library() # 註冊
2.編寫自定義過濾器
自定義過濾器就是接受一個或者連個參數的python函數。例如{{var | foo:"bar"}},過濾器foo接受變量var和參數bar。
過濾器函數總要返回一些內容,而且不該該拋出異常,若是有異常,也應該安靜的出錯,因此出錯的時候要不返回原始的輸入或者空串,下面是一個例子:code
def cut(value, arg): """Removes all values of arg from the given string""" return value.replace(arg, '') # 使用 {{ somevariable|cut:"0" }}
若是過濾器不接受參數,只須要這樣寫orm
def lower(value): # 只有一個參數 return value.lower()
3.註冊自定義的過濾器
一旦定義好你的過濾器,你須要註冊這個過濾器,有兩種方式,一種是上面提到的template.Library(),另外一種是裝飾器對象
#第一種方法 register.filter('cut', cut) register.filter('lower', lower) #第二種方法 @register.filter(name='cut') def cut(value, arg): return value.replace(arg, '') @register.filter def lower(value): return value.lower()
詳細內容請查閱Django的文檔:自定義模板標籤和過濾器開發
編寫自定義模板標籤文檔
標籤比過濾器更復雜,由於標籤能夠作任何事情。Django提供了許多快捷方式,能夠更輕鬆地編寫大多數類型的標籤。首先,咱們將探索這些快捷方式,而後解釋如何在快捷方式不夠強大的狀況下從頭開始編寫標記
爲了簡化這些類型標籤的建立,Django提供了一個輔助函數 simple_tag。這個函數是一個方法 django.template.Library,它接受一個接受任意數量參數的函數,將它包裝在一個render函數中,並將上面提到的其餘必要位包裝在模板系統中
current_time所以,咱們的函數能夠這樣寫:
import datetime from django import template register = template.Library() @register.simple_tag def current_time(format_string): return datetime.datetime.now().strftime(format_string)
更多內容還請查閱Django的文檔:自定義模板標籤和過濾器,不過這些已經基本足夠使用了。