Django中的模板語言有許多內建語法可以幫助我們完成渲染網頁的工作,但往往我們需要的功能有許多是內建語法所沒有提供的,因此我們需要透過自定義標籤來協助我們做到這些事情。
自定義過濾器、simple_tag及inclusion_tag這三種功能各有其應用場景,但是建立方法卻都類似
1. 在專案下開啟一個名為"templatetags"的資料夾,不能多或少任何一個字母,且只能有一個,不能放在專案下其他app下
2. 在settings.py中的INSTALL_APPS中,加入要套用自定過濾器的app
3. 在templates下創建一個任一名稱的.py檔案,例如myfilter.py
4. 在模板中導入上一部所創建的檔案名 {% load myfilter%},django會自行去所有的app及全局下找到templatetags資料夾,並引用標籤內的文件名
5. 重啟django服務,這一步如果不做,你是無論如何都無法導入你所定義的標籤的
第3步中,必須要在文件中寫入以下程式碼:
from django.template import Library register = Library() @register.filter def myfilter(x,y): return x*y
myfilter(x,y) 就是這個過濾器的名稱
在第4步導入自定義文件後,使用 {{ x | myfilter: y }} 來應用這個過濾器
simple_tag的寫法步驟與自定過濾器相同,只有在第3步寫入的內容不同:
@register.simple_tag def multi_tag(x,y): return x * y
應用的方法也改為在template中寫入 {% multi_tag x y %}
與過濾器不同的是,simple_tag的參數可以多於2個,而過濾器只能有兩個。
inclusion_tag與前面兩者稍有不同,需要額外寫一個template
myfilter.py
@register.inclusion_tag("web/menu.html") # 括號中寫入內容回傳的目標 def get_menu_style(): menu_list=[123,666,999] return {'menu_list':menu_list} #{"目標文件中的對應參數名":此函數中的變數}
template文件 web/menu.html
<ul> {% for foo in menu_list %} <li>{{ foo }}</li> {% endfor %} </ul>
最後,到要渲染的目標文件中應用這個inclusion_tag
{% load myfilter %}
{% get_menu_style %}