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 %}
01-06 16:38