當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python Django Library.inclusion_tag用法及代碼示例


本文介紹 django.template.Library.inclusion_tag 的用法。

聲明

django.template.Library.inclusion_tag()

另一種常見的模板標簽類型是通過渲染another模板來顯示一些數據的類型。例如,Django 的管理接口使用自定義模板標簽來顯示 “add/change” 表單頁麵底部的按鈕。這些按鈕看起來總是一樣的,但鏈接目標會根據正在編輯的對象而變化——因此它們是使用填充了當前對象詳細信息的小模板的完美案例。 (在管理員的情況下,這是submit_row 標簽。)

這些類型的標簽稱為“inclusion tags”。

編寫包含標簽可能最好通過示例來演示。讓我們編寫一個標簽,輸出給定 Poll 對象的選項列表,例如在教程中創建的對象。我們將像這樣使用標簽:

{% show_results 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_linkhome_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>.

然後,任何時候您想使用該自定義標簽,加載它的庫並在沒有任何參數的情況下調用它,如下所示:

{% jump_link %}

請注意,當您使用 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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。