??自定義過濾器需要先創建模板庫,創建模板庫分兩步:
決定模板庫放到哪個目錄下,可以放在一個應用(app)下,也可以將模板庫放在一個模板庫放在一個單獨的應用下,推薦使用后者,方便在其他應用中使用。不管采用那種方式,都需要將該應用添加到INSTALLED_APPS中
-
在模板庫所在應用下新建一個templatetags目錄,這個目錄與models.py、views.py處于同一層次
??本人通過startapp在項目下新建了一個應用用于存放自定義模板文件,其目錄格式如下所示:
??自定義過濾器目錄結構
??然后在templatetags目錄下,創建兩個空文件(init.py和存放自定義過濾器的文件),其中init.py告訴Python這是一個包含了Python代碼的包,如上圖所示,這里我創建的存放自定義過濾器內容的文件為custom_template.py
??作為合法的標簽庫,模塊需要包含一個名為register的模塊級變量,這個變量是template.Library的實例,是所有注冊標簽和過濾器的數據結構。所以需要在模塊存放自定義文件的頂部插入如下語句:
from django import template register = template.Library()
??做完這些準備工作后,接下來就可以創建自定義過濾器了。自定義過濾器就是有一個或兩個參數的Python函數:
(輸入)變量的值
-
參數的值,可以是默認值或者完全留空
例如,在過濾器{{ var | foo:"bar" }}中,過濾器foo會被傳入變量var和參數bar
??以一個去掉變量值空格的過濾器為例,在custom-template.py中定義一個處理函數:def remove_space(value, arg): return value.replace(arg, '')
??定義完過濾器后,還需要用Library實例來注冊它:
#Library.filter()方法接受兩個參數:過濾器名稱和過濾器函數本身
register.filter('remove_space', remove_space)
??至此,就可以通過{% load custom_template %}加載過濾器,然后在模板文件中使用:
{% load custom_template %}
{{ message | remove_space:' ' }}
??假設傳入的message為"custom template",則 {{ message | remove_space:' ' }}輸出為"customtemplate"
??END!