內建範本標籤和篩選器

此文件描述了 Django 的內建範本標籤和篩選器。建議您使用自動文件(如果可用),因為這也會包含任何已安裝的自訂標籤或篩選器的文件。

內建標籤參考

autoescape

控制目前自動跳脫行為。此標籤接受 onoff 作為引數,並決定自動跳脫在區塊內是否生效。該區塊以 endautoescape 結束標籤關閉。

範例用法

{% autoescape on %}
    {{ body }}
{% endautoescape %}

當自動跳脫生效時,所有從變數衍生的內容都會套用 HTML 跳脫,然後再將結果放入輸出中(但在套用任何篩選器之後)。這相當於手動將escape 篩選器套用至每個變數。

唯一的例外是已經標記為「安全」免於跳脫的變數。變數可以透過填充變數的程式碼、套用safeescape 篩選器,或者因為它是將字串標記為「安全」的先前篩選器的結果,來標記為「安全」。

在停用自動跳脫的範圍內,鏈接篩選器(包括 escape)可能會導致意料之外(但有文件說明)的結果,例如以下情況

{% autoescape off %}
    {{ my_list|join:", "|escape }}
{% endautoescape %}

以上程式碼將輸出 my_list 的已連結元素,且未跳脫。這是因為篩選器鏈接序列首先對 my_list 執行 join(因為 autoescapeoff,因此不對每個項目套用跳脫),並將結果標記為安全。隨後,此安全結果將被饋送到 escape 篩選器,該篩選器不會套用第二輪跳脫。

為了正確跳脫序列中的每個元素,請使用 escapeseq 篩選器

{% autoescape off %}
    {{ my_list|escapeseq|join:", " }}
{% endautoescape %}

block

定義一個可以被子範本覆蓋的區塊。有關更多資訊,請參閱範本繼承

comment

忽略 {% comment %}{% endcomment %} 之間的所有內容。可以在第一個標籤中插入一個可選的註解。例如,這在註解掉程式碼以記錄停用程式碼的原因時很有用。

範例用法

<p>Rendered text with {{ pub_date|date:"c" }}</p>
{% comment "Optional note" %}
    <p>Commented out text with {{ create_date|date:"c" }}</p>
{% endcomment %}

comment 標籤不能巢狀化。

csrf_token

此標籤用於 CSRF 保護,如跨站請求偽造的文件中所述。

cycle

每次遇到此標籤時,都會產生其中一個引數。第一次遇到時產生第一個引數,第二次遇到時產生第二個引數,依此類推。一旦所有引數都用完,該標籤將循環到第一個引數並再次產生它。

此標籤在迴圈中特別有用

{% for o in some_list %}
    <tr class="{% cycle 'row1' 'row2' %}">
        ...
    </tr>
{% endfor %}

第一次迭代產生引用類別 row1 的 HTML,第二次迭代產生引用 row2 的 HTML,第三次迭代再次產生 row1 的 HTML,對於迴圈的每次迭代都依此類推。

您也可以使用變數。例如,如果您有兩個範本變數 rowvalue1rowvalue2,則可以像這樣在它們的值之間交替

{% for o in some_list %}
    <tr class="{% cycle rowvalue1 rowvalue2 %}">
        ...
    </tr>
{% endfor %}

循環中包含的變數將被跳脫。您可以使用以下程式碼停用自動跳脫

{% for o in some_list %}
    <tr class="{% autoescape off %}{% cycle rowvalue1 rowvalue2 %}{% endautoescape %}">
        ...
    </tr>
{% endfor %}

您可以混合使用變數和字串

{% for o in some_list %}
    <tr class="{% cycle 'row1' rowvalue2 'row3' %}">
        ...
    </tr>
{% endfor %}

在某些情況下,您可能希望在不推進到下一個值的情況下引用循環的目前值。若要執行此操作,請使用「as」為 {% cycle %} 標籤提供名稱,如下所示

{% cycle 'row1' 'row2' as rowcolors %}

從那時起,您可以透過將循環名稱作為上下文變數來引用,在範本中任意插入循環的目前值。如果您想獨立於原始 cycle 標籤將循環移動到下一個值,您可以使用另一個 cycle 標籤並指定變數的名稱。所以,以下範本

<tr>
    <td class="{% cycle 'row1' 'row2' as rowcolors %}">...</td>
    <td class="{{ rowcolors }}">...</td>
</tr>
<tr>
    <td class="{% cycle rowcolors %}">...</td>
    <td class="{{ rowcolors }}">...</td>
</tr>

將輸出

<tr>
    <td class="row1">...</td>
    <td class="row1">...</td>
</tr>
<tr>
    <td class="row2">...</td>
    <td class="row2">...</td>
</tr>

您可以在 cycle 標籤中使用任意數量的以空格分隔的值。用單引號 (') 或雙引號 (") 括起來的值被視為字串文字,而沒有引號的值被視為範本變數。

預設情況下,當您將 as 關鍵字與循環標籤一起使用時,啟動循環的 {% cycle %} 本身將產生循環中的第一個值。如果您想在巢狀迴圈或包含的範本中使用該值,這可能會是一個問題。如果您只想宣告循環但不產生第一個值,則可以在標籤中新增 silent 關鍵字作為最後一個關鍵字。例如

{% for obj in some_list %}
    {% cycle 'row1' 'row2' as rowcolors silent %}
    <tr class="{{ rowcolors }}">{% include "subtemplate.html" %}</tr>
{% endfor %}

這將輸出一個 <tr> 元素列表,其 classrow1row2 之間交替。子範本將在其上下文中存取 rowcolors,並且該值將與包含它的 <tr> 的類別匹配。如果省略 silent 關鍵字,row1row2 將作為正常文字發出,在 <tr> 元素之外。

當在循環定義中使用 silent 關鍵字時,靜音會自動應用於該特定循環標籤的所有後續使用。以下範本將輸出任何內容,即使第二次呼叫 {% cycle %} 沒有指定 silent

{% cycle 'row1' 'row2' as rowcolors silent %}
{% cycle rowcolors %}

您可以使用 resetcycle 標籤,使 {% cycle %} 標籤在下次遇到時從其第一個值重新開始。

debug

輸出大量除錯資訊,包括目前的上下文和導入的模組。當 DEBUG 設定為 False 時,{% debug %} 不會輸出任何內容。

extends

表示此模板繼承自父模板。

此標籤可用於兩種方式

  • {% extends "base.html" %} (使用引號) 使用字面值 "base.html" 作為要繼承的父模板名稱。

  • {% extends variable %} 使用 variable 的值。如果該變數評估為字串,Django 將使用該字串作為父模板的名稱。如果該變數評估為 Template 物件,Django 將使用該物件作為父模板。

請參閱 模板繼承 以取得更多資訊。

通常,模板名稱是相對於模板載入器的根目錄。字串參數也可以是開頭為 ./../ 的相對路徑。例如,假設有以下目錄結構

dir1/
    template.html
    base2.html
    my/
        base3.html
base1.html

template.html 中,以下路徑將會有效

{% extends "./base2.html" %}
{% extends "../base1.html" %}
{% extends "./my/base3.html" %}

filter

透過一或多個篩選器過濾區塊的內容。可以使用管道指定多個篩選器,並且篩選器可以有引數,就像在變數語法中一樣。

請注意,此區塊包含 filterendfilter 標籤之間所有的文字。

範例用法

{% filter force_escape|lower %}
    This text will be HTML-escaped, and will appear in all lowercase.
{% endfilter %}

注意

escapesafe 篩選器是不可接受的引數。請改用 autoescape 標籤來管理模板程式碼區塊的自動跳脫。

firstof

輸出第一個不是「false」的引數變數(即存在、不是空的、不是 false 布林值,且不是零數值)。如果所有傳遞的變數都是「false」,則不輸出任何內容。

範例用法

{% firstof var1 var2 var3 %}

這等同於

{% if var1 %}
    {{ var1 }}
{% elif var2 %}
    {{ var2 }}
{% elif var3 %}
    {{ var3 }}
{% endif %}

您也可以使用字面字串作為後備值,以防所有傳遞的變數都是 False

{% firstof var1 var2 var3 "fallback value" %}

此標籤會自動跳脫變數值。您可以使用以下方式停用自動跳脫

{% autoescape off %}
    {% firstof var1 var2 var3 "<strong>fallback value</strong>" %}
{% endautoescape %}

或者,如果只有某些變數應該被跳脫,則可以使用

{% firstof var1 var2|safe var3 "<strong>fallback value</strong>"|safe %}

您可以使用語法 {% firstof var1 var2 var3 as value %} 將輸出儲存在變數中。

for

迴圈遍歷陣列中的每個項目,使該項目可在內容變數中使用。例如,要顯示 athlete_list 中提供的運動員列表

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% endfor %}
</ul>

您可以使用 {% for obj in list reversed %} 以反向迴圈遍歷列表。

如果您需要迴圈遍歷列表的列表,則可以將每個子列表中的值解壓縮到個別的變數中。例如,如果您的內容包含一個名為 points 的 (x,y) 座標列表,則可以使用以下方式輸出點的列表

{% for x, y in points %}
    There is a point at {{ x }},{{ y }}
{% endfor %}

如果您需要存取字典中的項目,這也很有用。例如,如果您的內容包含字典 data,則以下內容將顯示字典的鍵和值

{% for key, value in data.items %}
    {{ key }}: {{ value }}
{% endfor %}

請記住,對於點運算子,字典鍵查找優先於方法查找。因此,如果 data 字典包含一個名為 'items' 的鍵,則 data.items 將會返回 data['items'] 而不是 data.items()。如果要使用模板中的這些方法(itemsvalueskeys 等),請避免新增名稱與字典方法相同的鍵。在 模板變數的文件 中閱讀有關點運算子查找順序的更多資訊。

for 迴圈會在迴圈內設定一些可用的變數

變數

描述

forloop.counter

迴圈的目前迭代(從 1 開始)

forloop.counter0

迴圈的目前迭代(從 0 開始)

forloop.revcounter

從迴圈結尾開始的迭代次數(從 1 開始)

forloop.revcounter0

從迴圈結尾開始的迭代次數(從 0 開始)

forloop.first

如果這是第一次執行迴圈,則為 True

forloop.last

如果這是最後一次執行迴圈,則為 True

forloop.parentloop

對於巢狀迴圈,這是包圍目前迴圈的迴圈

forempty

for 標籤可以採用可選的 {% empty %} 子句,如果給定的陣列為空或找不到,則會顯示其文字

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% empty %}
    <li>Sorry, no athletes in this list.</li>
{% endfor %}
</ul>

以上等同於以下程式碼,但更簡短、更簡潔且可能更快

<ul>
  {% if athlete_list %}
    {% for athlete in athlete_list %}
      <li>{{ athlete.name }}</li>
    {% endfor %}
  {% else %}
    <li>Sorry, no athletes in this list.</li>
  {% endif %}
</ul>

if

{% if %} 標籤會評估變數,如果該變數為「true」(即存在、不是空的,且不是 false 布林值),則會輸出區塊的內容

{% if athlete_list %}
    Number of athletes: {{ athlete_list|length }}
{% elif athlete_in_locker_room_list %}
    Athletes should be out of the locker room soon!
{% else %}
    No athletes.
{% endif %}

在以上範例中,如果 athlete_list 不是空的,則運動員的人數將由 {{ athlete_list|length }} 變數顯示。

如您所見,if 標籤可以採用一個或多個 {% elif %} 子句,以及一個 {% else %} 子句,如果先前所有條件都失敗,則會顯示該子句。這些子句是可選的。

布林運算子

if 標籤可以使用 andornot 來測試多個變數或否定給定的變數

{% if athlete_list and coach_list %}
    Both athletes and coaches are available.
{% endif %}

{% if not athlete_list %}
    There are no athletes.
{% endif %}

{% if athlete_list or coach_list %}
    There are some athletes or some coaches.
{% endif %}

{% if not athlete_list or coach_list %}
    There are no athletes or there are some coaches.
{% endif %}

{% if athlete_list and not coach_list %}
    There are some athletes and absolutely no coaches.
{% endif %}

允許在同一個標籤中使用 andor 子句,其中 and 的優先順序高於 or,例如

{% if athlete_list and coach_list or cheerleader_list %}

會被解讀為

if (athlete_list and coach_list) or cheerleader_list:
    ...

if 標籤中使用實際的括號是無效的語法。如果您需要它們來表示優先順序,則應使用巢狀的 if 標籤。

if 標籤也可以使用運算子 ==!=<><=>=innot inisis not,其運作方式如下

== 運算子

相等。範例

{% if somevar == "x" %}
  This appears if variable somevar equals the string "x"
{% endif %}
!= 運算子

不相等。範例

{% if somevar != "x" %}
  This appears if variable somevar does not equal the string "x",
  or if somevar is not found in the context
{% endif %}
< 運算子

小於。範例

{% if somevar < 100 %}
  This appears if variable somevar is less than 100.
{% endif %}
> 運算子

大於。範例

{% if somevar > 0 %}
  This appears if variable somevar is greater than 0.
{% endif %}
<= 運算子

小於或等於。範例

{% if somevar <= 100 %}
  This appears if variable somevar is less than 100 or equal to 100.
{% endif %}
>= 運算子

大於或等於。範例

{% if somevar >= 1 %}
  This appears if variable somevar is greater than 1 or equal to 1.
{% endif %}
in 運算子

包含於。此運算子由許多 Python 容器支援,用於測試給定的值是否在容器中。以下是一些 x in y 的解讀範例

{% if "bc" in "abcdef" %}
  This appears since "bc" is a substring of "abcdef"
{% endif %}

{% if "hello" in greetings %}
  If greetings is a list or set, one element of which is the string
  "hello", this will appear.
{% endif %}

{% if user in users %}
  If users is a QuerySet, this will appear if user is an
  instance that belongs to the QuerySet.
{% endif %}
not in 運算子

不包含於。這是 in 運算子的否定。

is 運算子

物件識別。測試兩個值是否為同一個物件。範例

{% if somevar is True %}
  This appears if and only if somevar is True.
{% endif %}

{% if somevar is None %}
  This appears if somevar is None, or if somevar is not found in the context.
{% endif %}
is not 運算子

否定物件識別。測試兩個值是否不是同一個物件。這是 is 運算子的否定。範例

{% if somevar is not True %}
  This appears if somevar is not True, or if somevar is not found in the
  context.
{% endif %}

{% if somevar is not None %}
  This appears if and only if somevar is not None.
{% endif %}

篩選器

您也可以在 if 表達式中使用篩選器。例如

{% if messages|length >= 100 %}
   You have lots of messages today!
{% endif %}

複雜的表達式

以上所有內容都可以組合形成複雜的表達式。對於這類表達式,了解表達式求值時運算子的分組方式(即優先順序規則)非常重要。運算子的優先順序,從最低到最高,如下所示

  • or

  • and

  • not

  • in

  • ==, !=, <, >, <=, >=

(這完全遵循 Python)。因此,舉例來說,以下複雜的 if 標籤

{% if a == b or c == d and e %}

…將被解讀為

(a == b) or ((c == d) and e)

如果您需要不同的優先順序,您將需要使用巢狀的 if 標籤。有時候,為了那些不了解優先順序規則的人,為了清晰起見,這樣做會更好。

比較運算子不能像在 Python 或數學符號中那樣「鏈式」使用。例如,不要使用

{% if a > b > c %}  (WRONG)

您應該使用

{% if a > b and b > c %}

ifchanged

檢查某個值是否與迴圈的上次迭代相比發生了變化。

{% ifchanged %} 區塊標籤在迴圈內使用。它有兩種可能的用法。

  1. 檢查其自身呈現的內容是否與之前的狀態相比發生了變化,並且僅在內容發生變化時才顯示內容。例如,這會顯示一個日期列表,只有在月份更改時才會顯示月份

    <h1>Archive for {{ year }}</h1>
    
    {% for date in days %}
        {% ifchanged %}<h3>{{ date|date:"F" }}</h3>{% endifchanged %}
        <a href="{{ date|date:"M/d"|lower }}/">{{ date|date:"j" }}</a>
    {% endfor %}
    
  2. 如果給定一個或多個變數,則檢查是否有任何變數發生了變化。例如,以下程式碼會在日期每次更改時顯示日期,同時在小時或日期發生更改時顯示小時

    {% for date in days %}
        {% ifchanged date.date %} {{ date.date }} {% endifchanged %}
        {% ifchanged date.hour date.date %}
            {{ date.hour }}
        {% endifchanged %}
    {% endfor %}
    

ifchanged 標籤也可以採用可選的 {% else %} 子句,如果值沒有更改,則會顯示該子句

{% for match in matches %}
    <div style="background-color:
        {% ifchanged match.ballot_id %}
            {% cycle "red" "blue" %}
        {% else %}
            gray
        {% endifchanged %}
    ">{{ match }}</div>
{% endfor %}

include

載入一個範本並使用目前的上下文來呈現它。這是一種在範本中「包含」其他範本的方式。

範本名稱可以是變數或硬式編碼的(帶引號的)字串,無論是單引號還是雙引號。

此範例會包含範本 "foo/bar.html" 的內容

{% include "foo/bar.html" %}

通常,範本名稱是相對於範本載入器的根目錄的。字串參數也可以是起始於 ./../ 的相對路徑,如 extends 標籤中所述。

此範例會包含名稱包含在變數 template_name 中的範本的內容

{% include template_name %}

變數也可以是任何具有接受上下文的 render() 方法的物件。這允許您在上下文中參考已編譯的 Template

此外,變數也可以是範本名稱的可迭代物件,在這種情況下,將使用第一個可以載入的範本,如同 select_template() 中所述。

包含的範本會在包含它的範本的上下文中呈現。此範例會產生輸出 "Hello, John!"

  • 上下文:變數 person 設定為 "John",變數 greeting 設定為 "Hello"

  • 範本

    {% include "name_snippet.html" %}
    
  • name_snippet.html 範本

    {{ greeting }}, {{ person|default:"friend" }}!
    

您可以使用關鍵字參數將其他上下文傳遞給範本

{% include "name_snippet.html" with person="Jane" greeting="Hello" %}

如果您只想使用提供的變數(甚至完全沒有變數)來呈現上下文,請使用 only 選項。其他變數都無法用於包含的範本

{% include "name_snippet.html" with greeting="Hi" only %}

注意

include 標籤應被視為「呈現這個子範本並包含 HTML」的實作,而不是「剖析這個子範本並包含其內容,就像它是父範本的一部分一樣」。這表示包含的範本之間沒有共用的狀態,每次包含都是完全獨立的呈現過程。

區塊會在包含 *之前* 進行評估。這表示從另一個範本包含區塊的範本將包含 *已評估和呈現* 的區塊,而不是可以由例如擴充範本覆寫的區塊。

load

載入自訂範本標籤集。

例如,以下範本將載入在套件 packagesomelibraryotherlibrary 中註冊的所有標籤和篩選器

{% load somelibrary package.otherlibrary %}

您也可以使用 from 參數,有選擇地從程式庫載入個別的篩選器或標籤。在此範例中,名稱為 foobar 的範本標籤/篩選器將從 somelibrary 載入

{% load foo bar from somelibrary %}

有關更多資訊,請參閱 自訂標籤和篩選器程式庫

lorem

顯示隨機的「lorem ipsum」拉丁文字。這對於在範本中提供範例資料很有用。

用法

{% lorem [count] [method] [random] %}

{% lorem %} 標籤可以使用零、一、二或三個參數。參數如下

參數

描述

count

一個數字(或變數),其中包含要產生的段落或單字數量(預設為 1)。

method

字詞的 w、HTML 段落的 p 或純文字段落區塊的 b(預設為 b)。

random

單字 random,如果給定,則在產生文字時不會使用常見的段落(「Lorem ipsum dolor sit amet…」)。

範例

  • {% lorem %} 將輸出常見的「lorem ipsum」段落。

  • {% lorem 3 p %} 將輸出常見的「lorem ipsum」段落和兩個隨機段落,每個段落都包含在 HTML <p> 標籤中。

  • {% lorem 2 w random %} 將輸出兩個隨機的拉丁文字。

now

使用根據給定字串的格式顯示目前的日期和/或時間。此字串可以包含 date 篩選器章節中描述的格式指定字元。

範例

It is {% now "jS F Y H:i" %}

請注意,如果您想使用「原始」值,您可以反斜線跳脫格式字串。在此範例中,「o」和「f」都使用反斜線跳脫,因為否則它們每個都是顯示年份和時間的格式字串

It is the {% now "jS \o\f F" %}

這會顯示為「It is the 4th of September」。

注意

傳遞的格式也可以是預先定義的格式之一:DATE_FORMATDATETIME_FORMATSHORT_DATE_FORMATSHORT_DATETIME_FORMAT。預先定義的格式可能會根據目前的語言環境而有所不同,並且如果啟用 格式本地化,例如

It is {% now "SHORT_DATETIME_FORMAT" %}

您也可以使用語法 {% now "Y" as current_year %} 將輸出(作為字串)儲存在變數中。如果您想在範本標籤(例如 blocktranslate)內使用 {% now %},這會很有用

{% now "Y" as current_year %}
{% blocktranslate %}Copyright {{ current_year }}{% endblocktranslate %}

querystring

Django 5.1 中的新功能。

根據提供的參數輸出 URL 編碼的格式化查詢字串。

此標籤需要 QueryDict 執行個體,如果沒有提供,則預設為 request.GET

如果 QueryDict 為空且未提供額外參數,則會回傳一個空字串。非空的結果會包含一個前導的 "?"

預設使用 request.GET

若要使用 request.GET 作為預設的 QueryDict 實例,應啟用 django.template.context_processors.request 上下文處理器。若未啟用,您必須將 request 物件明確傳遞到樣板上下文中,或者為此標籤提供一個 QueryDict 實例。

基本用法

{% querystring %}

原樣輸出目前的查詢字串。因此,如果查詢字串為 ?color=green,輸出將為 ?color=green

{% querystring size="M" %}

輸出目前的查詢字串,並額外加入 size 參數。承接先前的範例,輸出將為 ?color=green&size=M

自訂 QueryDict

{% querystring my_query_dict %}

您可以提供自訂的 QueryDict 以取代 request.GET。因此,如果 my_query_dict<QueryDict: {'color': ['blue']}>,則會輸出 ?color=blue

設定項目

{% querystring color="red" size="S" %}

在查詢字串中加入或修改參數。每個關鍵字引數都會被加到查詢字串中,並取代該鍵的任何現有值。舉例來說,如果目前的查詢字串為 ?color=green,輸出將為 ?color=red&size=S

移除項目

{% querystring color=None %}

傳遞 None 作為值會從查詢字串中移除該參數。舉例來說,如果目前的查詢字串為 ?color=green&size=M,輸出將為 ?size=M

處理列表

{% querystring color=my_list %}

如果 my_list["red", "blue"],輸出將為 ?color=red&color=blue,在查詢字串中保留列表結構。

動態用法

使用此標籤的一個常見範例是,在顯示結果頁面時保留目前的查詢字串,同時新增指向下一頁和上一頁結果的連結。舉例來說,如果分頁器目前在第 3 頁,而目前的查詢字串為 ?color=blue&size=M&page=3,則以下程式碼會輸出 ?color=blue&size=M&page=4

{% querystring page=page.next_page_number %}

您也可以將值儲存在變數中。舉例來說,如果您需要多個指向相同頁面的連結,請將其定義為

{% querystring page=page.next_page_number as next_page %}

regroup

將類似物件的列表依據共同屬性重新分組。

這個複雜的標籤最好用範例來說明:假設 cities 是一個城市列表,由包含 "name""population""country" 鍵的字典表示。

cities = [
    {"name": "Mumbai", "population": "19,000,000", "country": "India"},
    {"name": "Calcutta", "population": "15,000,000", "country": "India"},
    {"name": "New York", "population": "20,000,000", "country": "USA"},
    {"name": "Chicago", "population": "7,000,000", "country": "USA"},
    {"name": "Tokyo", "population": "33,000,000", "country": "Japan"},
]

…而且您想要顯示一個依國家/地區排序的階層列表,如下所示

  • 印度

    • 孟買:19,000,000

    • 加爾各答:15,000,000

  • 美國

    • 紐約:20,000,000

    • 芝加哥:7,000,000

  • 日本

    • 東京:33,000,000

您可以使用 {% regroup %} 標籤,依國家/地區分組城市列表。以下範本程式碼片段可以完成此操作

{% regroup cities by country as country_list %}

<ul>
{% for country in country_list %}
    <li>{{ country.grouper }}
    <ul>
        {% for city in country.list %}
          <li>{{ city.name }}: {{ city.population }}</li>
        {% endfor %}
    </ul>
    </li>
{% endfor %}
</ul>

讓我們逐步檢視此範例。{% regroup %} 採用三個引數:您想要重新分組的列表、要依據分組的屬性,以及結果列表的名稱。在此,我們依據 country 屬性重新分組 cities 列表,並將結果命名為 country_list

{% regroup %} 會產生一個群組物件列表(在此範例中為 country_list)。群組物件是 namedtuple() 的實例,具有兩個欄位

  • grouper – 依據分組的項目(例如,字串「印度」或「日本」)。

  • list – 此群組中所有項目的列表(例如,所有國家/地區 =「印度」的城市列表)。

因為 {% regroup %} 會產生 namedtuple() 物件,您也可以將先前的範例寫成

{% regroup cities by country as country_list %}

<ul>
{% for country, local_cities in country_list %}
    <li>{{ country }}
    <ul>
        {% for city in local_cities %}
          <li>{{ city.name }}: {{ city.population }}</li>
        {% endfor %}
    </ul>
    </li>
{% endfor %}
</ul>

請注意,{% regroup %} 不會排序其輸入!我們的範例依賴於 cities 列表在一開始是依據 country 排序的事實。如果 cities 列表沒有依據 country 排序其成員,重新分組會天真地為單一國家/地區顯示多個群組。舉例來說,假設 cities 列表設定為這樣(請注意,國家/地區並未分組在一起)

cities = [
    {"name": "Mumbai", "population": "19,000,000", "country": "India"},
    {"name": "New York", "population": "20,000,000", "country": "USA"},
    {"name": "Calcutta", "population": "15,000,000", "country": "India"},
    {"name": "Chicago", "population": "7,000,000", "country": "USA"},
    {"name": "Tokyo", "population": "33,000,000", "country": "Japan"},
]

對於 cities 的這個輸入,上述範例 {% regroup %} 範本程式碼會產生以下輸出

  • 印度

    • 孟買:19,000,000

  • 美國

    • 紐約:20,000,000

  • 印度

    • 加爾各答:15,000,000

  • 美國

    • 芝加哥:7,000,000

  • 日本

    • 東京:33,000,000

解決此問題最簡單的方法是,確保您的視圖程式碼中,資料是根據您想要顯示的方式排序的。

另一種解決方案是,如果您的資料是字典列表,請使用 dictsort 篩選器在範本中排序資料

{% regroup cities|dictsort:"country" by country as country_list %}

依其他屬性分組

任何有效的範本查閱都是 regroup 標籤的合法分組屬性,包括方法、屬性、字典鍵和列表項目。舉例來說,如果「country」欄位是具有屬性「description」的類別之外鍵,則可以使用

{% regroup cities by country.description as country_list %}

或者,如果 country 是具有 choices 的欄位,它將會具有可作為屬性的 get_FOO_display() 方法,讓您能夠依據顯示字串而不是 choices 鍵分組

{% regroup cities by get_country_display as country_list %}

{{ country.grouper }} 現在會顯示 choices 集中數值欄位的值,而不是鍵。

resetcycle

重設先前的 cycle,使其在下次遇到時從第一個項目重新開始。如果沒有引數,{% resetcycle %} 會重設在範本中定義的最後一個 {% cycle %}

用法範例

{% for coach in coach_list %}
    <h1>{{ coach.name }}</h1>
    {% for athlete in coach.athlete_set.all %}
        <p class="{% cycle 'odd' 'even' %}">{{ athlete.name }}</p>
    {% endfor %}
    {% resetcycle %}
{% endfor %}

此範例會傳回此 HTML

<h1>Gareth</h1>
<p class="odd">Harry</p>
<p class="even">John</p>
<p class="odd">Nick</p>

<h1>John</h1>
<p class="odd">Andrea</p>
<p class="even">Melissa</p>

請注意,第一個區塊以 class="odd" 結尾,而新的區塊以 class="odd" 開頭。如果沒有 {% resetcycle %} 標籤,第二個區塊會以 class="even" 開頭。

您也可以重設具名的 cycle 標籤

{% for item in list %}
    <p class="{% cycle 'odd' 'even' as stripe %} {% cycle 'major' 'minor' 'minor' 'minor' 'minor' as tick %}">
        {{ item.data }}
    </p>
    {% ifchanged item.category %}
        <h1>{{ item.category }}</h1>
        {% if not forloop.first %}{% resetcycle tick %}{% endif %}
    {% endifchanged %}
{% endfor %}

在此範例中,我們同時有交替的奇/偶數列和每五列一個「主要」列。當類別變更時,只會重設五列的循環。

spaceless

移除 HTML 標籤之間的空格。這包括 Tab 字元和換行符號。

用法範例

{% spaceless %}
    <p>
        <a href="foo/">Foo</a>
    </p>
{% endspaceless %}

此範例會傳回此 HTML

<p><a href="foo/">Foo</a></p>

只會移除標籤之間的空格,而不是標籤和文字之間的空格。在此範例中,Hello 周圍的空格不會被移除

{% spaceless %}
    <strong>
        Hello
    </strong>
{% endspaceless %}

templatetag

輸出用來組成範本標籤的其中一個語法字元。

範本系統沒有「跳脫」個別字元的概念。但是,您可以使用 {% templatetag %} 標籤來顯示其中一個範本標籤字元組合。

此參數指定要輸出的樣板位元。

參數

輸出

openblock

{%

closeblock

%}

openvariable

{{

closevariable

}}

openbrace

{

closebrace

}

opencomment

{#

closecomment

#}

範例用法

The {% templatetag openblock %} characters open a block.

另請參閱 verbatim 標籤,了解包含這些字元的另一種方式。

url

返回與給定視圖和可選參數匹配的絕對路徑參照(不帶網域名的 URL)。產生的路徑中的任何特殊字元都將使用 iri_to_uri() 進行編碼。

這是一種輸出連結的方法,而無需在樣板中硬式編碼 URL,從而避免違反 DRY 原則。

{% url 'some-url-name' v1 v2 %}

第一個參數是 URL 模式名稱。它可以是帶引號的文字或任何其他上下文變數。額外的參數是可選的,應該是以空格分隔的值,將用作 URL 中的參數。上面的範例顯示了傳遞位置參數。或者,您可以使用關鍵字語法。

{% url 'some-url-name' arg1=v1 arg2=v2 %}

請勿在單個呼叫中混合使用位置語法和關鍵字語法。URLconf 需要的所有參數都應該存在。

例如,假設您有一個視圖 app_views.client,其 URLconf 採用客戶端 ID(這裡,client() 是視圖檔案 app_views.py 內的方法)。URLconf 行可能如下所示:

path("client/<int:id>/", app_views.client, name="app-views-client")

如果此應用程式的 URLconf 以如下路徑包含在專案的 URLconf 中:

path("clients/", include("project_name.app_name.urls"))

...然後,在樣板中,您可以像這樣建立指向此視圖的連結:

{% url 'app-views-client' client.id %}

樣板標籤將輸出字串 /clients/client/123/

請注意,如果您要反轉的 URL 不存在,則會引發 NoReverseMatch 異常,這將導致您的網站顯示錯誤頁面。

如果您想在不顯示 URL 的情況下檢索 URL,可以使用略有不同的呼叫:

{% url 'some-url-name' arg arg2 as the_url %}

<a href="{{ the_url }}">I'm linking to {{ the_url }}</a>

as var 語法建立的變數範圍是出現 {% url %} 標籤的 {% block %} 範圍。

如果視圖遺失,此 {% url ... as var %} 語法將不會導致錯誤。在實務中,您將使用此語法連結到可選的視圖。

{% url 'some-url-name' as the_url %}
{% if the_url %}
  <a href="{{ the_url }}">Link to optional stuff</a>
{% endif %}

如果您想檢索命名空間的 URL,請指定完整限定名稱:

{% url 'myapp:view-name' %}

這將遵循正常的 命名空間 URL 解析策略,包括使用上下文提供的關於目前應用程式的任何提示。

警告

不要忘記在 URL 模式 name 周圍加上引號,否則該值將被解釋為上下文變數!

verbatim

停止樣板引擎呈現此區塊標籤的內容。

一個常見的用途是允許與 Django 語法衝突的 JavaScript 樣板層。例如:

{% verbatim %}
    {{if dying}}Still alive.{{/if}}
{% endverbatim %}

您也可以指定一個特定的關閉標籤,允許使用 {% endverbatim %} 作為未呈現內容的一部分。

{% verbatim myblock %}
    Avoid template rendering via the {% verbatim %}{% endverbatim %} block.
{% endverbatim myblock %}

widthratio

對於建立長條圖之類的功能,此標籤會計算給定值與最大值的比率,然後將該比率應用於常數。

例如:

<img src="bar.png" alt="Bar"
     height="10" width="{% widthratio this_value max_value max_width %}">

如果 this_value 為 175,max_value 為 200,且 max_width 為 100,則上述範例中的影像寬度將為 88 像素(因為 175/200 = .875;.875 * 100 = 87.5,四捨五入為 88)。

在某些情況下,您可能需要將 widthratio 的結果擷取到變數中。例如,在 blocktranslate 中,這可能很有用,如下所示:

{% widthratio this_value max_value max_width as width %}
{% blocktranslate %}The width is: {{ width }}{% endblocktranslate %}

with

將複雜的變數快取在更簡單的名稱下。當多次存取「昂貴」的方法(例如,命中資料庫的方法)時,這會很有用。

例如:

{% with total=business.employees.count %}
    {{ total }} employee{{ total|pluralize }}
{% endwith %}

已填入的變數(在上面的範例中為 total)僅在 {% with %}{% endwith %} 標籤之間可用。

您可以指派多個上下文變數:

{% with alpha=1 beta=2 %}
    ...
{% endwith %}

注意

仍然支援先前的更詳細格式: {% with business.employees.count as total %}

內建篩選器參考

add

將參數新增至值。

例如:

{{ value|add:"2" }}

如果 value4,則輸出將為 6

此篩選器會先嘗試強制將兩個值轉換為整數。如果失敗,它仍然會嘗試將這些值相加。這適用於某些資料類型(字串、清單等),而對其他資料類型則會失敗。如果失敗,結果將為空字串。

例如,如果我們有:

{{ first|add:second }}

first[1, 2, 3],而 second[4, 5, 6],則輸出將為 [1, 2, 3, 4, 5, 6]

警告

可以強制轉換為整數的字串將會被加總,而不是串連,如上文的第一個範例所示。

addslashes

在引號前新增斜線。對於在 CSV 中跳脫字串很有用,例如:

例如:

{{ value|addslashes }}

如果 value"I'm using Django",則輸出將為 "I\'m using Django"

capfirst

將值的第一個字元大寫。如果第一個字元不是字母,則此篩選器無效。

例如:

{{ value|capfirst }}

如果 value"django",則輸出將為 "Django"

center

將值置中於給定寬度的欄位中。

例如:

"{{ value|center:"15" }}"

如果 value"Django",則輸出將為 "     Django    "

cut

從給定字串中移除 arg 的所有值。

例如:

{{ value|cut:" " }}

如果 value"String with spaces",則輸出將為 "Stringwithspaces"

date

根據給定的格式格式化日期。

使用類似於 PHP 的 date() 函數的格式,但有一些差異。

注意

這些格式字元在樣板之外的 Django 中不使用。它們的設計與 PHP 相容,以便於設計師轉換。

可用的格式字串

格式字元

描述

範例輸出

日期

d

月份中的日期,2 位數字,前面帶 0。

'01''31'

j

月份中的日期,不帶前導 0。

'1''31'

D

星期幾,文字,3 個字母。

'Fri'

l

星期幾,文字,長格式。

'Friday'

S

月份中日期的英文序數詞尾碼,2 個字元。

'st''nd''rd''th'

w

星期幾,數字,不帶前導 0。

'0' (星期日) 到 '6' (星期六)

z

一年中的日期。

1366

W

ISO-8601 年的週數,週從星期一開始。

1, 53

月份

m

月份,2 位數字,前面帶 0。

'01''12'

n

月份,不帶前導 0。

'1''12'

M

月份,文字,3 個字母。

'Jan'

b

月份,文字,3 個字母,小寫。

'jan'

E

月份,地區特定替代表示法,通常用於長日期表示法。

'listopada' (對於波蘭地區設定,與 'Listopad' 相反)

F

月份,文字,長格式。

'January'

N

美聯社風格的月份縮寫。專有擴展。

'Jan.''Feb.''March''May'

t

指定月份的天數。

2831

年份

y

年份,2 位數,前導補零。

'00''99'

Y

年份,4 位數,前導補零。

'0001'、…、'1999'、…、'9999'

L

布林值,表示是否為閏年。

TrueFalse

o

ISO-8601 週數年份,對應使用閏週的 ISO-8601 週數 (W)。更常見的年份格式請參閱 Y。

'1999'

時間

g

小時,12 小時制,不帶前導零。

'1''12'

G

小時,24 小時制,不帶前導零。

'0''23'

h

小時,12 小時制。

'01''12'

H

小時,24 小時制。

'00''23'

i

分鐘。

'00''59'

s

秒,2 位數,前導補零。

'00''59'

u

微秒。

000000999999

a

'a.m.''p.m.' (請注意,這與 PHP 的輸出略有不同,因為這包含了句點以符合美聯社風格。)

'a.m.'

A

'AM''PM'

'AM'

f

時間,以 12 小時制的小時和分鐘表示,如果分鐘為零則省略分鐘。專有擴展。

'1', '1:30'

P

時間,以 12 小時制的小時、分鐘和 ‘a.m.’/’p.m.’ 表示,如果分鐘為零則省略分鐘,並在適當時使用特殊情況字串 ‘midnight’ 和 ‘noon’。專有擴展。

'1 a.m.''1:30 p.m.''midnight''noon''12:30 p.m.'

時區

e

時區名稱。可以採用任何格式,或者可能會根據日期時間返回空字串。

'''GMT''-500''US/Eastern' 等。

I

日光節約時間,無論是否生效。

'1''0'

O

與格林威治時間的小時差。

'+0200'

T

本機的時區。

'EST''MDT'

Z

時區偏移量(以秒為單位)。UTC 以西時區的偏移量始終為負數,而 UTC 以東時區的偏移量始終為正數。

-4320043200

日期/時間

c

ISO 8601 格式。(注意:與其他格式化器 (例如 “Z”、“O” 或 “r”) 不同,“c” 格式化器在值為 naive 日期時間時不會新增時區偏移量 (請參閱 datetime.tzinfo)。)

2008-01-02T10:30:00.000123+02:00,或如果日期時間為 naive 則為 2008-01-02T10:30:00.000123

r

RFC 5322 格式化的日期。

'Thu, 21 Dec 2000 16:01:07 +0200'

U

自 Unix Epoch (1970 年 1 月 1 日 00:00:00 UTC) 以來的秒數。

例如:

{{ value|date:"D d M Y" }}

如果 valuedatetime 物件 (例如,datetime.datetime.now() 的結果),則輸出將是字串 'Wed 09 Jan 2008'

傳遞的格式可以是預先定義的格式 DATE_FORMATDATETIME_FORMATSHORT_DATE_FORMATSHORT_DATETIME_FORMAT 之一,或者是使用上表中顯示的格式規範的自訂格式。請注意,預先定義的格式可能會因目前地區設定而異。

假設 LANGUAGE_CODE 例如是 "es",則對於

{{ value|date:"SHORT_DATE_FORMAT" }}

輸出將會是字串 "09/01/2008" (與 Django 一起發布的 es 地區設定的 "SHORT_DATE_FORMAT" 格式規範為 "d/m/Y")。

如果沒有格式字串使用,則會使用 DATE_FORMAT 格式規範。假設與前一個範例相同的設定

{{ value|date }}

輸出 9 de Enero de 2008 ( es 地區設定的 DATE_FORMAT 格式規範為 r'j \d\e F \d\e Y')。“d” 和 “e” 都使用反斜線跳脫,因為否則每一個都會是顯示日期和時區名稱的格式字串。

您可以將 datetime 篩選器結合,以呈現 datetime 值的完整表示法。例如

{{ value|date:"D d M Y" }} {{ value|time:"H:i" }}

default

如果 value 的評估結果為 False,則使用指定的預設值。否則,使用 value。

例如:

{{ value|default:"nothing" }}

如果 value"" (空字串),則輸出將為 nothing

default_if_none

如果 (且僅如果) value 為 None,則使用指定的預設值。否則,使用 value。

請注意,如果提供空字串,則不會使用預設值。如果您想要回退空字串,請使用 default 篩選器。

例如:

{{ value|default_if_none:"nothing" }}

如果 valueNone,則輸出將為 nothing

dictsort

取得字典列表,並傳回依據引數中給定的索引鍵排序的列表。

例如:

{{ value|dictsort:"name" }}

如果 value

[
    {"name": "zed", "age": 19},
    {"name": "amy", "age": 22},
    {"name": "joe", "age": 31},
]

則輸出將會是

[
    {"name": "amy", "age": 22},
    {"name": "joe", "age": 31},
    {"name": "zed", "age": 19},
]

您也可以執行更複雜的操作,例如

{% for book in books|dictsort:"author.age" %}
    * {{ book.title }} ({{ book.author.name }})
{% endfor %}

如果 books

[
    {"title": "1984", "author": {"name": "George", "age": 45}},
    {"title": "Timequake", "author": {"name": "Kurt", "age": 75}},
    {"title": "Alice", "author": {"name": "Lewis", "age": 33}},
]

則輸出將會是

* Alice (Lewis)
* 1984 (George)
* Timequake (Kurt)

dictsort 也可以依據指定索引的元素排序列表的列表 (或任何其他實作 __getitem__() 的物件)。例如

{{ value|dictsort:0 }}

如果 value

[
    ("a", "42"),
    ("c", "string"),
    ("b", "foo"),
]

則輸出將會是

[
    ("a", "42"),
    ("b", "foo"),
    ("c", "string"),
]

您必須將索引作為整數而不是字串傳遞。以下產生空白輸出

{{ values|dictsort:"0" }}

字典不支援依據指定索引的元素排序。

dictsortreversed

取得字典列表,並傳回依據引數中給定的索引鍵以相反順序排序的列表。這與上面的篩選器完全相同,但傳回的值會以相反順序排列。

divisibleby

如果 value 可被引數整除,則傳回 True

例如:

{{ value|divisibleby:"3" }}

如果 value21,則輸出會是 True

escape

將字串的 HTML 進行跳脫。具體來說,它會進行以下替換:

  • < 會轉換成 &lt;

  • > 會轉換成 &gt;

  • ' (單引號) 會轉換成 &#x27;

  • " (雙引號) 會轉換成 &quot;

  • & 會轉換成 &amp;

escape 應用於通常會自動跳脫的變數,只會進行一輪跳脫。因此,即使在自動跳脫的環境中使用此函數也是安全的。如果您希望套用多次跳脫,請使用 force_escape 篩選器。

例如,您可以在 autoescape 關閉時,將 escape 應用於欄位。

{% autoescape off %}
    {{ title|escape }}
{% endautoescape %}

escape 與其他篩選器串聯

autoescape 章節所述,當包括 escape 在內的篩選器串聯在一起時,如果前面的篩選器由於 autoescapeoff 而導致缺乏跳脫,將潛在不安全的字串標記為安全,則可能會導致意想不到的結果。

在這種情況下,串聯 escape 不會重新跳脫已經被標記為安全的字串。

當使用操作序列的篩選器時,這一點尤其重要,例如 join。如果您需要跳脫序列中的每個元素,請使用專用的 escapeseq 篩選器。

escapejs

跳脫字元以用於整個 JavaScript 字串文字,無論是在單引號還是雙引號中,如下所示。此篩選器不會使字串在「JavaScript 樣板文字」(JavaScript 反引號語法)中使用時安全。不支援任何其他未列出的用法。一般建議使用 HTML data- 屬性或 json_script 篩選器傳遞資料,而不是嵌入在 JavaScript 中。

例如:

<script>
let myValue = '{{ value|escapejs }}'

escapeseq

Django 5.0 新增。

escape 篩選器應用於序列中的每個元素。與其他操作序列的篩選器(例如 join)結合使用時很有用。例如:

{% autoescape off %}
    {{ my_list|escapeseq|join:", " }}
{% endautoescape %}

filesizeformat

將值格式化為「人類可讀」的檔案大小(例如 '13 KB''4.1 MB''102 bytes' 等)。

例如:

{{ value|filesizeformat }}

如果 value 是 123456789,則輸出會是 117.7 MB

檔案大小和 SI 單位

嚴格來說,當以 1024 的冪計算位元組大小時(此處為這種情況),filesizeformat 不符合國際單位制,該單位制建議使用 KiB、MiB、GiB 等。相反,Django 使用更常用的傳統單位名稱(KB、MB、GB 等)。

first

返回列表中的第一個項目。

例如:

{{ value|first }}

如果 value 是列表 ['a', 'b', 'c'],則輸出將為 'a'

floatformat

當不帶參數使用時,會將浮點數四捨五入到小數點後一位,但僅當有小數部分要顯示時才會這樣做。例如:

範本

輸出

34.23234

{{ value|floatformat }}

34.2

34.00000

{{ value|floatformat }}

34

34.26000

{{ value|floatformat }}

34.3

如果使用數字整數參數,floatformat 會將數字四捨五入到指定的小數位數。例如:

範本

輸出

34.23234

{{ value|floatformat:3 }}

34.232

34.00000

{{ value|floatformat:3 }}

34.000

34.26000

{{ value|floatformat:3 }}

34.260

特別有用的是傳遞 0 (零) 作為參數,這會將浮點數四捨五入到最接近的整數。

範本

輸出

34.23234

{{ value|floatformat:"0" }}

34

34.00000

{{ value|floatformat:"0" }}

34

39.56000

{{ value|floatformat:"0" }}

40

如果傳遞給 floatformat 的參數為負數,它會將數字四捨五入到指定的小數位數,但僅當有小數部分要顯示時才會這樣做。例如:

範本

輸出

34.23234

{{ value|floatformat:"-3" }}

34.232

34.00000

{{ value|floatformat:"-3" }}

34

34.26000

{{ value|floatformat:"-3" }}

34.260

如果傳遞給 floatformat 的參數帶有 g 後綴,它會強制使用目前地區設定的 THOUSAND_SEPARATOR 進行分組。例如,當目前的地區設定為 en (英文) 時:

範本

輸出

34232.34

{{ value|floatformat:"2g" }}

34,232.34

34232.06

{{ value|floatformat:"g" }}

34,232.1

34232.00

{{ value|floatformat:"-3g" }}

34,232

除非傳遞給 floatformat 的參數帶有 u 後綴(這會強制停用本地化),否則輸出始終會被本地化(獨立於 {% localize off %} 標籤)。例如,當目前的地區設定為 pl (波蘭文) 時:

範本

輸出

34.23234

{{ value|floatformat:"3" }}

34,232

34.23234

{{ value|floatformat:"3u" }}

34.232

不帶參數使用 floatformat 等同於使用參數為 -1floatformat

force_escape

將 HTML 跳脫應用於字串(詳細資訊請參閱 escape 篩選器)。此篩選器會立即應用並返回一個新的跳脫字串。這在您需要多次跳脫或想要將其他篩選器應用於跳脫結果的罕見情況下很有用。通常,您會想要使用 escape 篩選器。

例如,如果您想捕獲 linebreaks 篩選器建立的 <p> HTML 元素:

{% autoescape off %}
    {{ body|linebreaks|force_escape }}
{% endautoescape %}

get_digit

給定一個整數,返回請求的數字,其中 1 是最右邊的數字,2 是第二個最右邊的數字,依此類推。對於無效的輸入(如果輸入或參數不是整數,或者如果參數小於 1),則返回原始值。否則,輸出始終為整數。

例如:

{{ value|get_digit:"2" }}

如果 value123456789,則輸出將為 8

iriencode

將 IRI (國際化資源標識符) 轉換為適合包含在 URL 中的字串。如果您嘗試在 URL 中使用包含非 ASCII 字元的字串,則這是必要的。

在此字串已通過 urlencode 篩選器的情況下,可以安全地使用此篩選器。

例如:

{{ value|iriencode }}

如果 value"?test=I Django",則輸出將為 "?test=I%20%E2%99%A5%20Django"

join

將列表與字串連接,就像 Python 的 str.join(list) 一樣

例如:

{{ value|join:" // " }}

如果 value 是列表 ['a', 'b', 'c'],則輸出將是字串 "a // b // c"

json_script

安全地將 Python 物件輸出為 JSON 格式,並包裝在 <script> 標籤中,以便在 JavaScript 中使用。

參數: <script> 標籤可選的 HTML "id"。

例如:

{{ value|json_script:"hello-data" }}

如果 value 是字典 {'hello': 'world'},則輸出將會是

<script id="hello-data" type="application/json">{"hello": "world"}</script>

結果數據可以在 JavaScript 中像這樣存取

const value = JSON.parse(document.getElementById('hello-data').textContent);

通過轉義字元 “<”、“>” 和 “&”,可以降低 XSS 攻擊的風險。例如,如果 value{'hello': 'world</script>&amp;'},則輸出將會是

<script id="hello-data" type="application/json">{"hello": "world\\u003C/script\\u003E\\u0026amp;"}</script>

這與禁止頁內腳本執行的嚴格內容安全策略相容。它還保持被動數據和可執行程式碼之間的清晰分離。

last

返回列表中的最後一個項目。

例如:

{{ value|last }}

如果 value 是列表 ['a', 'b', 'c', 'd'],則輸出將會是字串 "d"

length

返回值的長度。這適用於字串和列表。

例如:

{{ value|length }}

如果 value['a', 'b', 'c', 'd']"abcd",則輸出將會是 4

對於未定義的變數,此篩選器會返回 0

linebreaks

將純文字中的換行符號替換為適當的 HTML;單個換行符號會變成 HTML 換行符號(<br>),而後接空行的換行符號則會變成段落分隔符號(</p>)。

例如:

{{ value|linebreaks }}

如果 valueJoel\nis a slug,則輸出將會是 <p>Joel<br>is a slug</p>

linebreaksbr

將一段純文字中的所有換行符號轉換為 HTML 換行符號(<br>)。

例如:

{{ value|linebreaksbr }}

如果 valueJoel\nis a slug,則輸出將會是 Joel<br>is a slug

linenumbers

顯示帶行號的文字。

例如:

{{ value|linenumbers }}

如果 value

one
two
three

輸出將會是

1. one
2. two
3. three

ljust

將值在給定寬度的欄位中靠左對齊。

參數: 欄位大小

例如:

"{{ value|ljust:"10" }}"

如果 valueDjango,則輸出將會是 "Django    "

lower

將字串轉換為全部小寫。

例如:

{{ value|lower }}

如果 valueTotally LOVING this Album!,則輸出將會是 totally loving this album!

make_list

返回轉換為列表的值。對於字串,它是一個字元列表。對於整數,會在建立列表之前將參數轉換為字串。

例如:

{{ value|make_list }}

如果 value 是字串 "Joel",則輸出將會是列表 ['J', 'o', 'e', 'l']。如果 value123,則輸出將會是列表 ['1', '2', '3']

phone2numeric

將電話號碼(可能包含字母)轉換為其數字等效值。

輸入不一定要是有效的電話號碼。這將會很樂意地轉換任何字串。

例如:

{{ value|phone2numeric }}

如果 value800-COLLECT,則輸出將會是 800-2655328

pluralize

如果值不是 1'1' 或長度為 1 的物件,則返回複數後綴。預設情況下,此後綴為 's'

範例

You have {{ num_messages }} message{{ num_messages|pluralize }}.

如果 num_messages1,則輸出將會是 You have 1 message.。如果 num_messages2,則輸出將會是 You have 2 messages.

對於需要 's' 以外後綴的單字,您可以將替代後綴作為篩選器的參數提供。

範例

You have {{ num_walruses }} walrus{{ num_walruses|pluralize:"es" }}.

對於不通過簡單後綴形成複數的單字,您可以指定單數和複數後綴,並以逗號分隔。

範例

You have {{ num_cherries }} cherr{{ num_cherries|pluralize:"y,ies" }}.

注意

使用 blocktranslate 來形成翻譯字串的複數。

pprint

圍繞 pprint.pprint() 的包裝函式 – 實際上是為了除錯。

random

從給定的列表中返回一個隨機項目。

例如:

{{ value|random }}

如果 value 是列表 ['a', 'b', 'c', 'd'],則輸出可能為 "b"

rjust

將值在給定寬度的欄位中靠右對齊。

參數: 欄位大小

例如:

"{{ value|rjust:"10" }}"

如果 valueDjango,則輸出將會是 "    Django"

safe

將字串標記為不需要在輸出之前進行進一步的 HTML 跳脫。當自動跳脫關閉時,此篩選器不起作用。

注意

如果您正在串連篩選器,則在 safe 之後套用的篩選器可能會使內容再次變為不安全。例如,以下程式碼會按原樣輸出變數,而不進行跳脫

{{ var|safe|escape }}

safeseq

safe 篩選器套用到序列的每個元素。與其他對序列運作的篩選器(例如 join)結合使用時非常有用。例如

{{ some_list|safeseq|join:", " }}

在這種情況下,您不能直接使用 safe 篩選器,因為它會先將變數轉換為字串,而不是處理序列的個別元素。

slice

返回列表的切片。

使用與 Python 列表切片相同的語法。請參閱 Python 文件 以取得介紹。

範例

{{ some_list|slice:":2" }}

如果 some_list['a', 'b', 'c'],則輸出將會是 ['a', 'b']

slugify

轉換為 ASCII。將空格轉換為連字號。移除非字母數字、底線或連字號的字元。轉換為小寫。也會移除開頭和結尾的空白。

例如:

{{ value|slugify }}

如果 value"Joel is a slug",則輸出將會是 "joel-is-a-slug"

stringformat

根據參數(字串格式規範)來格式化變數。此規範使用 printf 風格的字串格式設定 語法,但會省略開頭的 “%”。

例如:

{{ value|stringformat:"E" }}

如果 value10,則輸出將會是 1.000000E+01

striptags

盡一切可能移除所有 [X]HTML 標籤。

例如:

{{ value|striptags }}

如果 value"<b>Joel</b> <button>is</button> a <span>slug</span>",則輸出將會是 "Joel is a slug"

無安全保證

請注意,striptags 並不保證其輸出為 HTML 安全,尤其是在輸入非有效的 HTML 時。因此,絕對不要safe 篩選器應用於 striptags 的輸出。如果您正在尋找更穩健的解決方案,請考慮使用第三方 HTML 清理工具。

time

根據給定的格式格式化時間。

給定的格式可以是預定義的格式 TIME_FORMAT,或者像 date 篩選器一樣的自訂格式。請注意,預定義的格式是與地區相關的。

例如:

{{ value|time:"H:i" }}

如果 value 等同於 datetime.datetime.now(),則輸出將為字串 "01:23"

請注意,如果您想使用「原始」值,可以使用反斜線跳脫格式字串。在此範例中,「h」和「m」都使用反斜線跳脫,因為否則每個都是顯示小時和月份的格式字串

{{ value|time:"H\h i\m" }}

這將顯示為 "01h 23m"。

另一個範例

假設 LANGUAGE_CODE 例如是 "de",則對於

{{ value|time:"TIME_FORMAT" }}

輸出將為字串 "01:23" (與 Django 一起提供的 de 地區設定的 "TIME_FORMAT" 格式指定符是 "H:i")。

time 篩選器只會接受格式字串中與一天中的時間相關的參數,而不是日期。如果您需要格式化 date 值,請改用 date 篩選器(或者如果需要呈現完整的 datetime 值,則與 time 一起使用)。

上述規則有一個例外:當傳遞具有附加時區資訊的 datetime 值(一個 時區感知datetime 實例)時,time 篩選器將接受與時區相關的 格式指定符 'e''O''T''Z'

當不使用格式字串時,將使用 TIME_FORMAT 格式指定符

{{ value|time }}

與之相同

{{ value|time:"TIME_FORMAT" }}

timesince

將日期格式化為自該日期起的時間(例如,「4 天 6 小時」)。

接受一個可選參數,該參數是一個包含要用作比較點的日期的變數(不帶參數時,比較點是現在)。例如,如果 blog_date 是一個表示 2006 年 6 月 1 日午夜的日期實例,而 comment_date 是 2006 年 6 月 1 日 08:00 的日期實例,則以下程式碼會傳回「8 小時」

{{ blog_date|timesince:comment_date }}

比較偏移感知和偏移無知的日期時間將會傳回空字串。

分鐘是使用的最小單位,對於任何相對於比較點的未來日期,都將傳回「0 分鐘」。

timeuntil

timesince 類似,不同之處在於它測量從現在到給定日期或日期時間的時間。例如,如果今天是 2006 年 6 月 1 日,且 conference_date 是持有 2006 年 6 月 29 日的日期實例,則 {{ conference_date|timeuntil }} 將傳回「4 週」。

接受一個可選參數,該參數是一個包含要用作比較點的日期(而不是現在)的變數。如果 from_date 包含 2006 年 6 月 22 日,則以下程式碼將會傳回「1 週」

{{ conference_date|timeuntil:from_date }}

比較偏移感知和偏移無知的日期時間將會傳回空字串。

分鐘是使用的最小單位,對於任何相對於比較點的過去日期,都將傳回「0 分鐘」。

title

將字串轉換為首字母大寫的格式,方法是使單字以大寫字元開頭,而其餘字元為小寫。此標籤並未嘗試使「不重要的單字」保持小寫。

例如:

{{ value|title }}

如果 value"my FIRST post",則輸出將為 "My First Post"

truncatechars

如果字串長度超過指定的字元數,則會截斷字串。截斷的字串將以可翻譯的省略號字元(「…」)結尾。

參數: 要截斷的字元數

例如:

{{ value|truncatechars:7 }}

如果 value"Joel is a slug",則輸出將為 "Joel i…"

truncatechars_html

truncatechars 類似,不同之處在於它能感知 HTML 標籤。在字串中開啟且在截斷點之前未關閉的任何標籤都會在截斷後立即關閉。

例如:

{{ value|truncatechars_html:7 }}

如果 value"<p>Joel is a slug</p>",則輸出將為 "<p>Joel i…</p>"

HTML 內容中的換行符號將會被保留。

輸入字串的大小

處理大型、可能格式錯誤的 HTML 字串可能會消耗大量資源並影響服務效能。truncatechars_html 將輸入限制為前五百萬個字元。

在 Django 3.2.22 中變更

在較舊的版本中,會處理超過五百萬個字元的字串。

truncatewords

在特定數量的單字後截斷字串。

參數: 要在之後截斷的單字數

例如:

{{ value|truncatewords:2 }}

如果 value"Joel is a slug",則輸出將為 "Joel is …"

字串中的換行符號將會被移除。

truncatewords_html

truncatewords 類似,不同之處在於它能感知 HTML 標籤。在字串中開啟且在截斷點之前未關閉的任何標籤都會在截斷後立即關閉。

這比 truncatewords 的效率低,因此只有在傳遞 HTML 文字時才應使用。

例如:

{{ value|truncatewords_html:2 }}

如果 value"<p>Joel is a slug</p>",則輸出將為 "<p>Joel is …</p>"

HTML 內容中的換行符號將會被保留。

輸入字串的大小

處理大型、可能格式錯誤的 HTML 字串可能會消耗大量資源並影響服務效能。truncatewords_html 將輸入限制為前五百萬個字元。

在 Django 3.2.22 中變更

在較舊的版本中,會處理超過五百萬個字元的字串。

unordered_list

遞迴地取得自我巢狀列表並傳回 HTML 無序列表 – 沒有開啟和關閉 <ul> 標籤。

假設列表具有正確的格式。例如,如果 var 包含 ['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']],則 {{ var|unordered_list }} 將傳回

<li>States
<ul>
        <li>Kansas
        <ul>
                <li>Lawrence</li>
                <li>Topeka</li>
        </ul>
        </li>
        <li>Illinois</li>
</ul>
</li>

upper

將字串轉換為全部大寫。

例如:

{{ value|upper }}

如果 value"Joel is a slug",輸出將會是 "JOEL IS A SLUG"

urlencode

將值逸出以便在 URL 中使用。

例如:

{{ value|urlencode }}

如果 value"https://www.example.org/foo?a=b&c=d",輸出將會是 "https%3A//www.example.org/foo%3Fa%3Db%26c%3Dd"

可以提供一個包含不應逸出字元的選擇性參數。

如果未提供,則假設「/」字元是安全的。當所有字元都應逸出時,可以提供空字串。例如

{{ value|urlencode:"" }}

如果 value"https://www.example.org/",輸出將會是 "https%3A%2F%2Fwww.example.org%2F"

urlize

將文字中的 URL 和電子郵件地址轉換為可點擊的連結。

此範本標籤適用於以 http://https://www. 開頭的連結。例如,https://djangocon.eu 會被轉換,但 djangocon.eu 不會。

它也支援以原始頂級網域(.com.edu.gov.int.mil.net.org)結尾的網域專用連結。例如,djangoproject.com 會被轉換。

連結可以有尾隨標點符號(句號、逗號、右括號)和開頭標點符號(左括號),並且 urlize 仍然會正確處理。

urlize 產生的連結會在其上新增 rel="nofollow" 屬性。

例如:

{{ value|urlize }}

如果 value"Check out www.djangoproject.com",輸出將會是 "Check out <a href="https://djangoproject.dev.org.tw" rel="nofollow">www.djangoproject.com</a>"

除了網站連結外,urlize 也會將電子郵件地址轉換為 mailto: 連結。如果 value"Send questions to foo@example.com",輸出將會是 "Send questions to <a href="mailto:foo@example.com">foo@example.com</a>"

urlize 篩選器也接受一個選擇性參數 autoescape。如果 autoescapeTrue,連結文字和 URL 將使用 Django 的內建 escape 篩選器進行逸出。autoescape 的預設值為 True

注意

如果 urlize 套用至已包含 HTML 標記的文字,或套用至包含單引號(')的電子郵件地址,則結果不會如預期。僅將此篩選器套用至純文字。

警告

使用 urlizeurlizetrunc 可能會產生效能損失,當套用至使用者控制的值(例如儲存在 TextField 中的內容)時,可能會變得嚴重。您可以使用 truncatechars 為此類輸入新增限制。

{{ value|truncatechars:500|urlize }}

urlizetrunc

將 URL 和電子郵件地址轉換為可點擊的連結,與 urlize 相同,但會截斷長度超過給定字元限制的 URL。

引數: 連結文字應截斷的字元數,包括必要時新增的省略符號。

例如:

{{ value|urlizetrunc:15 }}

如果 value"Check out www.djangoproject.com",輸出將會是 'Check out <a href="https://djangoproject.dev.org.tw" rel="nofollow">www.djangoproj…</a>'

urlize 一樣,此篩選器應僅套用至純文字。

wordcount

傳回單字數。

例如:

{{ value|wordcount }}

如果 value"Joel is a slug",輸出將會是 4

wordwrap

在指定的行長度處換行。

引數: 換行文字的字元數

例如:

{{ value|wordwrap:5 }}

如果 valueJoel is a slug,輸出將會是

Joel
is a
slug

yesno

TrueFalse 和(選擇性的)None 的值對應到字串「yes」、「no」、「maybe」或以逗號分隔的清單形式傳遞的自訂對應,並根據值傳回其中一個字串

例如:

{{ value|yesno:"yeah,no,maybe" }}

參數

輸出

True

yes

True

"yeah,no,maybe"

yeah

False

"yeah,no,maybe"

no

None

"yeah,no,maybe"

maybe

None

"yeah,no"

no(如果未提供 None 的對應,則將 None 轉換為 False

國際化標籤和篩選器

Django 提供範本標籤和篩選器來控制範本中國際化的每個層面。它們允許對翻譯、格式設定和時區轉換進行精細控制。

i18n

此程式庫允許在範本中指定可翻譯的文字。要啟用它,請將 USE_I18N 設定為 True,然後使用 {% load i18n %} 載入它。

請參閱國際化:在範本程式碼中

l10n

此程式庫提供對範本中值進行本地化的控制。您只需要使用 {% load l10n %} 載入程式庫即可。

請參閱在範本中控制本地化

tz

此程式庫提供對範本中時區轉換的控制。與 l10n 一樣,您只需要使用 {% load tz %} 載入程式庫,但您通常也會將 USE_TZ 設定為 True,以便預設情況下發生轉換為當地時間。

請參閱範本中的時區感知輸出

其他標籤和篩選器程式庫

Django 隨附幾個其他範本標籤程式庫,您必須在您的 INSTALLED_APPS 設定中明確啟用它們,並使用 {% load %} 標籤在您的範本中啟用它們。

django.contrib.humanize

一組 Django 範本篩選器,用於為數據添加「人性化」的觸感。請參閱 django.contrib.humanize

static

static

為了連結到儲存在 STATIC_ROOT 中的靜態檔案,Django 提供了一個 static 範本標籤。如果已安裝 django.contrib.staticfiles 應用程式,則此標籤將使用 url() 方法提供檔案,此方法由 STORAGESstaticfiles 指定的儲存空間所提供。例如:

{% load static %}
<img src="{% static 'images/hi.jpg' %}" alt="Hi!">

它也能够使用标准的上下文變數,例如,假设一個 user_stylesheet 變數被傳遞到範本

{% load static %}
<link rel="stylesheet" href="{% static user_stylesheet %}" media="screen">

如果您想检索一个静态 URL 而不显示它,您可以使用稍有不同的调用方式

{% load static %}
{% static "images/hi.jpg" as myphoto %}
<img src="{{ myphoto }}" alt="Hi!">

使用 Jinja2 範本嗎?

請參閱 Jinja2,了解如何在 Jinja2 中使用 static 標籤。

get_static_prefix

您應該優先使用 static 範本標籤,但如果您需要更精確地控制 STATIC_URL 如何以及在何處注入範本,您可以使用 get_static_prefix 範本標籤

{% load static %}
<img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!">

如果您需要多次使用該值,還有第二種形式可以避免額外的處理

{% load static %}
{% get_static_prefix as STATIC_PREFIX %}

<img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!">
<img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!">

get_media_prefix

get_static_prefix 類似,get_media_prefix 會使用媒體前綴 MEDIA_URL 填充範本變數,例如:

{% load static %}
<body data-media-url="{% get_media_prefix %}">

透過將值儲存在資料屬性中,我們確保如果我們想在 JavaScript 環境中使用它,它會被適當轉義。

回到頂部