天天看點

django 自定模闆标簽的注冊

首先注冊方法一般都是先執行個體化一個template.Library。如:

from django import template

register = template.Library()      

1.注冊自定義過濾器方法

register.filter('A',b)

filter()方法中的2個參數分别:A過濾器的名稱(一個字串)和 b過濾器函數本身。

2.注冊自定義模闆标簽方法

register.tag('A',b)

tag()方法需要2個參數:模闆标簽的名字A和編譯的函數b。

3.注冊簡單标簽的方法如:if ,for ,ifequal等等

register.simple_tag(A)

該輔助函數傳遞的函數隻有(單個)參數,參數兩邊的引号(如果有的話)已被截掉了是以隻可能接收到一個普通的Unicode字元串。

4.注冊包含标簽的方法

register.inclusion_tag('A.html')(B)

inclusion_tag()方法需要2個參數:模闆所在的檔案A和編譯的函數B。

有時候,包含标簽需要通路父模闆的context.此時可用到takes_context選項,即設定takes_context=True,并且該标簽不需要參數,且下面的Python函數會帶一個參數:就是當這個标簽被調用時的模闆context.

@register.inclusion_tag('A.html',takes_context=True)
def jump_link(context):#此處參數必須是context
    return {
        'link':context['home_link'],
        'title':context['home_title'],
        #此處有包含指向首頁的變量,即取home_link和home_title中的變量link和title的值
    }      

然後建立A.html,裡面可能包含下面内容:

XXXXX<a href="{{ link }}">{{ title }}</a>xxxxxx    該處的link和title分别取自home_link和home_title中的内容。

如果要調用該參數,可以直接加載它的庫,然後不帶參數地調用它{{ jump_link }}

5.編寫自定義模闆加載器

load_template_source(template_name,template_dirs=None)

template_name是加載模闆的名稱,類似于loader.get_template()或者loader.select_template()

template_dirs是一個可選的代替TEMPLATE_DIRS的搜尋目錄清單

如果加載器能夠成功的加載一個模闆,此時會傳回一個元組(template_source,template_path),template_source:模闆引擎編譯的模闆字元串、template_path:被加載的模闆路徑。若加載器加載模闆失敗,那麼會觸發django.template.TemplateDoesNotExist異常。

注:在上面代碼中看到@xxxx,這樣的寫法,改文法在python 2.4及以上版本中成立,即:

@register.tag(name="A")     #A過濾器的名稱(一個字串)
def B(parser.token):
  #.....      

或者直接寫成:

@register.tag
def B(parser,token):
  #......      

Django此處會使用函數名稱B來作為标簽名稱