不管是寫自訂標籤還是過濾器,第一件要做的事是建立模板庫(Django能夠匯入的基本結構)。
建立一個模板庫分兩步走:
第一,決定模板庫應該放在哪個Django應用下。 如果你通過 manage.py startapp 建立了一個應用,你可以把它放在那裡,或者你可以為模板庫單獨建立一個應用。 我們更推薦使用後者,因為你的filter可能在後來的工程中有用。
無論你採用何種方式,請確保把你的應用添加到 INSTALLED_APPS 中。 我們稍後會解釋這一點。
第二,在適當的Django應用程式套件裡建立一個 templatetags 目錄。 這個目錄應當和 models.py 、 views.py 等處於同一層次。 例如:
books/ __init__.py models.py templatetags/ views.py
在 templatetags 中建立兩個空檔案: 一個 __init__.py (告訴Python這是 一個包含了Python代碼的包)和一個用來存放你自訂的標籤/過濾器定義的檔案。 第二個檔案的名字稍後將用來載入標籤。 例如,如果你的自訂標籤/過濾器在一個叫作 poll_extras.py 的檔案中,你需要在模板中寫入如下內容:
{% load poll_extras %}
{% load %} 標籤檢查 INSTALLED_APPS 中的設定,僅允許載入已安裝的Django應用程式中的模板庫。 這是一個安全特性;它可以讓你在一台電腦上部署很多的模板庫的代碼,而又不用把它們暴露給每一個Django安裝。
如果你寫了一個不和任何特定模型/視圖關聯的模板庫,那麼得到一個僅包含 templatetags 包的Django應用程式套件組合是完全正常的。 對於在 templatetags 包中放置多少個模組沒有做任何的限制。 需要瞭解的是:{%load%}語句是通過指定的Python模組名而不是應用程式名稱來載入標籤/過濾器的。
一旦建立了Python模組,你只需根據是要編寫過濾器還是標籤來相應的編寫一些Python代碼。
作為合法的標籤庫,模組需要包含一個名為register的模組層級變數。這個變數是template.Library的執行個體,是所有註冊標籤和過濾器的資料結構。 所以,請在你的模組的頂部插入如下語句:
from django import templateregister = template.Library()
注意
請閱讀Django預設的過濾器和標籤的源碼,那裡有大量的例子。 他們分別為: django/template/defaultfilters.py 和 django/template/defaulttags.py 。django.contrib中的某些應用程式也包含模板庫。
建立 register 變數後,你就可以使用它來建立模板的過濾器和標籤了。