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


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


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

聲明

django.template.Library.simple_tag()

許多模板標簽采用許多參數 - 字符串或模板變量 - 並在僅基於輸入參數和一些外部信息進行一些處理後返回結果。例如,current_time 標記可能接受格式字符串並將時間作為相應格式的字符串返回。

為了簡化這些類型的標簽的創建,Django 提供了一個輔助函數 simple_tag 。該函數是 django.template.Library 的一個方法,它接受一個接受任意數量參數的函數,將其包裝在 render 函數和上麵提到的其他必要位中,並將其注冊到模板係統中。

因此,我們的current_time 函數可以這樣編寫:

import datetime
from django import template

register = template.Library()

@register.simple_tag
def current_time(format_string):
    return datetime.datetime.now().strftime(format_string)

關於 simple_tag 輔助函數的一些注意事項:

  • 在調用我們的函數時已經檢查了所需的參數數量等,因此我們不需要這樣做。
  • 參數周圍的引號(如果有的話)已經被去掉了,所以我們收到一個純字符串。
  • 如果參數是模板變量,我們的函數將傳遞變量的當前值,而不是變量本身。

與其他標記實用程序不同,如果模板上下文處於自動轉義模式,simple_tag 將通過 conditional_escape() 傳遞其輸出,以確保正確的 HTML 並保護您免受 XSS 漏洞的侵害。

如果不需要額外的轉義,如果您絕對確定您的代碼不包含 XSS 漏洞,則需要使用 mark_safe() 。對於構建小的 HTML 片段,強烈建議使用 format_html() 而不是 mark_safe()

如果您的模板標簽需要訪問當前上下文,您可以在注冊標簽時使用takes_context 參數:

@register.simple_tag(takes_context=True)
def current_time(context, format_string):
    timezone = context['timezone']
    return your_get_current_time_method(timezone, format_string)

請注意,第一個參數 must 被稱為 context

有關 takes_context 選項如何工作的更多信息,請參閱包含標記部分。

如果您需要重命名標簽,可以為其提供自定義名稱:

register.simple_tag(lambda x: x - 1, name='minusone')

@register.simple_tag(name='minustwo')
def some_function(value):
    return value - 2

simple_tag 函數可以接受任意數量的位置或關鍵字參數。例如:

@register.simple_tag
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 %}

可以將標記結果存儲在模板變量中,而不是直接輸出。這是通過使用as 參數後跟變量名來完成的。這樣做可以讓您自己輸出您認為合適的內容:

{% current_time "%Y-%m-%d %I:%M %p" as the_time %}
<p>The time is {{ the_time }}.</p>

相關用法


注:本文由純淨天空篩選整理自djangoproject.com大神的英文原創作品 django.template.Library.simple_tag。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。