本文介紹 django.template.Library.inclusion_tag
的用法。
聲明
django.template.Library.inclusion_tag()
另一種常見的模板標簽類型是通過渲染another
模板來顯示一些數據的類型。例如,Django 的管理接口使用自定義模板標簽來顯示 “add/change” 表單頁麵底部的按鈕。這些按鈕看起來總是一樣的,但鏈接目標會根據正在編輯的對象而變化——因此它們是使用填充了當前對象詳細信息的小模板的完美案例。 (在管理員的情況下,這是submit_row
標簽。)
這些類型的標簽稱為“inclusion tags”。
編寫包含標簽可能最好通過示例來演示。讓我們編寫一個標簽,輸出給定 Poll
對象的選項列表,例如在教程中創建的對象。我們將像這樣使用標簽:
…輸出將是這樣的:
<ul>
<li>First choice</li>
<li>Second choice</li>
<li>Third choice</li>
</ul>
首先,定義接受參數並為結果生成數據字典的函數。這裏重要的一點是我們隻需要返回一個字典,而不是更複雜的東西。這將用作模板片段的模板上下文。例子:
def show_results(poll):
choices = poll.choice_set.all()
return {'choices': choices}
接下來,創建用於呈現標簽輸出的模板。這個模板是標簽的一個固定特性:標簽編寫者指定它,而不是模板設計者。按照我們的示例,模板非常短:
<ul>
{% for choice in choices %}
<li> {{ choice }} </li>
{% endfor %}
</ul>
現在,通過在Library
對象上調用inclusion_tag()
方法來創建和注冊包含標記。按照我們的示例,如果上述模板位於模板加載器搜索的目錄中名為 results.html
的文件中,我們將像這樣注冊標簽:
# Here, register is a django.template.Library instance, as before
@register.inclusion_tag('results.html')
def show_results(poll):
...
或者,可以使用 django.template.Template
實例注冊包含標簽:
from django.template.loader import get_template
t = get_template('results.html')
register.inclusion_tag(t)(show_results)
…當第一次創建函數時。
有時,您的包含標簽可能需要大量參數,這讓模板作者很難傳入所有參數並記住它們的順序。為了解決這個問題,Django 為包含標簽提供了一個takes_context
選項。如果您在創建模板標記時指定takes_context
,則該標記將沒有必需的參數,並且底層 Python 函數將有一個參數 - 調用標記時的模板上下文。
例如,假設您正在編寫一個包含標記,該標記將始終在包含指向主頁的 home_link
和 home_title
變量的上下文中使用。這是 Python 函數的樣子:
@register.inclusion_tag('link.html', takes_context=True)
def jump_link(context):
return {
'link': context['home_link'],
'title': context['home_title'],
}
請注意,函數 must
的第一個參數稱為 context
。
在register.inclusion_tag()
行中,我們指定了takes_context=True
和模板的名稱。以下是模板link.html
的樣子:
Jump directly to <a href="{{ link }}">{{ title }}</a>.
然後,任何時候您想使用該自定義標簽,加載它的庫並在沒有任何參數的情況下調用它,如下所示:
請注意,當您使用 takes_context=True
時,無需將參數傳遞給模板標簽。它會自動訪問上下文。
takes_context
參數默認為 False
。當它設置為 True
時,標簽被傳遞給上下文對象,如本例所示。這是本案例與之前的 inclusion_tag
示例之間的唯一區別。
inclusion_tag
函數可以接受任意數量的位置或關鍵字參數。例如:
@register.inclusion_tag('my_template.html')
def my_tag(a, b, *args, **kwargs):
warning = kwargs['warning']
profile = kwargs['profile']
...
return ...
然後在模板中,可以將任意數量的以空格分隔的參數傳遞給模板標簽。與 Python 一樣,關鍵字參數的值使用等號(“=
”)設置,並且必須在位置參數之後提供。例如:
{% my_tag 123 "abcd" book.title warning=message|lower profile=user.profile %}
相關用法
注:本文由純淨天空篩選整理自djangoproject.com大神的英文原創作品 django.template.Library.inclusion_tag。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。