內建範本標籤和篩選器¶
此文件描述了 Django 的內建範本標籤和篩選器。建議您使用自動文件(如果可用),因為這也會包含任何已安裝的自訂標籤或篩選器的文件。
內建標籤參考¶
autoescape
¶
控制目前自動跳脫行為。此標籤接受 on
或 off
作為引數,並決定自動跳脫在區塊內是否生效。該區塊以 endautoescape
結束標籤關閉。
範例用法
{% autoescape on %}
{{ body }}
{% endautoescape %}
當自動跳脫生效時,所有從變數衍生的內容都會套用 HTML 跳脫,然後再將結果放入輸出中(但在套用任何篩選器之後)。這相當於手動將escape
篩選器套用至每個變數。
唯一的例外是已經標記為「安全」免於跳脫的變數。變數可以透過填充變數的程式碼、套用safe
或 escape
篩選器,或者因為它是將字串標記為「安全」的先前篩選器的結果,來標記為「安全」。
在停用自動跳脫的範圍內,鏈接篩選器(包括 escape
)可能會導致意料之外(但有文件說明)的結果,例如以下情況
{% autoescape off %}
{{ my_list|join:", "|escape }}
{% endautoescape %}
以上程式碼將輸出 my_list
的已連結元素,且未跳脫。這是因為篩選器鏈接序列首先對 my_list
執行 join
(因為 autoescape
為 off
,因此不對每個項目套用跳脫),並將結果標記為安全。隨後,此安全結果將被饋送到 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,對於迴圈的每次迭代都依此類推。
您也可以使用變數。例如,如果您有兩個範本變數 rowvalue1
和 rowvalue2
,則可以像這樣在它們的值之間交替
{% 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>
元素列表,其 class
在 row1
和 row2
之間交替。子範本將在其上下文中存取 rowcolors
,並且該值將與包含它的 <tr>
的類別匹配。如果省略 silent
關鍵字,row1
和 row2
將作為正常文字發出,在 <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
¶
透過一或多個篩選器過濾區塊的內容。可以使用管道指定多個篩選器,並且篩選器可以有引數,就像在變數語法中一樣。
請注意,此區塊包含 filter
和 endfilter
標籤之間所有的文字。
範例用法
{% filter force_escape|lower %}
This text will be HTML-escaped, and will appear in all lowercase.
{% endfilter %}
注意
escape
和 safe
篩選器是不可接受的引數。請改用 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()
。如果要使用模板中的這些方法(items
、values
、keys
等),請避免新增名稱與字典方法相同的鍵。在 模板變數的文件 中閱讀有關點運算子查找順序的更多資訊。
for 迴圈會在迴圈內設定一些可用的變數
變數 |
描述 |
---|---|
|
迴圈的目前迭代(從 1 開始) |
|
迴圈的目前迭代(從 0 開始) |
|
從迴圈結尾開始的迭代次數(從 1 開始) |
|
從迴圈結尾開始的迭代次數(從 0 開始) |
|
如果這是第一次執行迴圈,則為 True |
|
如果這是最後一次執行迴圈,則為 True |
|
對於巢狀迴圈,這是包圍目前迴圈的迴圈 |
for
… empty
¶
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
標籤可以使用 and
、or
或 not
來測試多個變數或否定給定的變數
{% 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 %}
允許在同一個標籤中使用 and
和 or
子句,其中 and
的優先順序高於 or
,例如
{% if athlete_list and coach_list or cheerleader_list %}
會被解讀為
if (athlete_list and coach_list) or cheerleader_list:
...
在 if
標籤中使用實際的括號是無效的語法。如果您需要它們來表示優先順序,則應使用巢狀的 if
標籤。
if
標籤也可以使用運算子 ==
、!=
、<
、>
、<=
、>=
、in
、not in
、is
和 is 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 %}
區塊標籤在迴圈內使用。它有兩種可能的用法。
檢查其自身呈現的內容是否與之前的狀態相比發生了變化,並且僅在內容發生變化時才顯示內容。例如,這會顯示一個日期列表,只有在月份更改時才會顯示月份
<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 %}
如果給定一個或多個變數,則檢查是否有任何變數發生了變化。例如,以下程式碼會在日期每次更改時顯示日期,同時在小時或日期發生更改時顯示小時
{% 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
¶
載入自訂範本標籤集。
例如,以下範本將載入在套件 package
中 somelibrary
和 otherlibrary
中註冊的所有標籤和篩選器
{% load somelibrary package.otherlibrary %}
您也可以使用 from
參數,有選擇地從程式庫載入個別的篩選器或標籤。在此範例中,名稱為 foo
和 bar
的範本標籤/篩選器將從 somelibrary
載入
{% load foo bar from somelibrary %}
有關更多資訊,請參閱 自訂標籤和篩選器程式庫。
lorem
¶
顯示隨機的「lorem ipsum」拉丁文字。這對於在範本中提供範例資料很有用。
用法
{% lorem [count] [method] [random] %}
{% lorem %}
標籤可以使用零、一、二或三個參數。參數如下
參數 |
描述 |
---|---|
|
一個數字(或變數),其中包含要產生的段落或單字數量(預設為 1)。 |
|
字詞的 |
|
單字 |
範例
{% 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_FORMAT
、DATETIME_FORMAT
、SHORT_DATE_FORMAT
或 SHORT_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
¶
根據提供的參數輸出 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 %}
標籤來顯示其中一個範本標籤字元組合。
此參數指定要輸出的樣板位元。
參數 |
輸出 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
範例用法
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" }}
如果 value
為 4
,則輸出將為 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 相容,以便於設計師轉換。
可用的格式字串
格式字元 |
描述 |
範例輸出 |
---|---|---|
日期 |
||
|
月份中的日期,2 位數字,前面帶 0。 |
|
|
月份中的日期,不帶前導 0。 |
|
|
星期幾,文字,3 個字母。 |
|
|
星期幾,文字,長格式。 |
|
|
月份中日期的英文序數詞尾碼,2 個字元。 |
|
|
星期幾,數字,不帶前導 0。 |
|
|
一年中的日期。 |
|
週 |
||
|
ISO-8601 年的週數,週從星期一開始。 |
|
月份 |
||
|
月份,2 位數字,前面帶 0。 |
|
|
月份,不帶前導 0。 |
|
|
月份,文字,3 個字母。 |
|
|
月份,文字,3 個字母,小寫。 |
|
|
月份,地區特定替代表示法,通常用於長日期表示法。 |
|
|
月份,文字,長格式。 |
|
|
美聯社風格的月份縮寫。專有擴展。 |
|
|
指定月份的天數。 |
|
年份 |
||
|
年份,2 位數,前導補零。 |
|
|
年份,4 位數,前導補零。 |
|
|
布林值,表示是否為閏年。 |
|
|
ISO-8601 週數年份,對應使用閏週的 ISO-8601 週數 (W)。更常見的年份格式請參閱 Y。 |
|
時間 |
||
|
小時,12 小時制,不帶前導零。 |
|
|
小時,24 小時制,不帶前導零。 |
|
|
小時,12 小時制。 |
|
|
小時,24 小時制。 |
|
|
分鐘。 |
|
|
秒,2 位數,前導補零。 |
|
|
微秒。 |
|
|
|
|
|
|
|
|
時間,以 12 小時制的小時和分鐘表示,如果分鐘為零則省略分鐘。專有擴展。 |
|
|
時間,以 12 小時制的小時、分鐘和 ‘a.m.’/’p.m.’ 表示,如果分鐘為零則省略分鐘,並在適當時使用特殊情況字串 ‘midnight’ 和 ‘noon’。專有擴展。 |
|
時區 |
||
|
時區名稱。可以採用任何格式,或者可能會根據日期時間返回空字串。 |
|
|
日光節約時間,無論是否生效。 |
|
|
與格林威治時間的小時差。 |
|
|
本機的時區。 |
|
|
時區偏移量(以秒為單位)。UTC 以西時區的偏移量始終為負數,而 UTC 以東時區的偏移量始終為正數。 |
|
日期/時間 |
||
|
ISO 8601 格式。(注意:與其他格式化器 (例如 “Z”、“O” 或 “r”) 不同,“c” 格式化器在值為 naive 日期時間時不會新增時區偏移量 (請參閱 |
|
|
RFC 5322 格式化的日期。 |
|
|
自 Unix Epoch (1970 年 1 月 1 日 00:00:00 UTC) 以來的秒數。 |
例如:
{{ value|date:"D d M Y" }}
如果 value
是 datetime
物件 (例如,datetime.datetime.now()
的結果),則輸出將是字串 'Wed 09 Jan 2008'
。
傳遞的格式可以是預先定義的格式 DATE_FORMAT
、DATETIME_FORMAT
、SHORT_DATE_FORMAT
或 SHORT_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” 都使用反斜線跳脫,因為否則每一個都會是顯示日期和時區名稱的格式字串。
您可以將 date
與 time
篩選器結合,以呈現 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" }}
如果 value
為 None
,則輸出將為 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" }}
如果 value
是 21
,則輸出會是 True
。
escape
¶
將字串的 HTML 進行跳脫。具體來說,它會進行以下替換:
<
會轉換成<
>
會轉換成>
'
(單引號) 會轉換成'
"
(雙引號) 會轉換成"
&
會轉換成&
將 escape
應用於通常會自動跳脫的變數,只會進行一輪跳脫。因此,即使在自動跳脫的環境中使用此函數也是安全的。如果您希望套用多次跳脫,請使用 force_escape
篩選器。
例如,您可以在 autoescape
關閉時,將 escape
應用於欄位。
{% autoescape off %}
{{ title|escape }}
{% endautoescape %}
將 escape
與其他篩選器串聯
如 autoescape
章節所述,當包括 escape
在內的篩選器串聯在一起時,如果前面的篩選器由於 autoescape
為 off
而導致缺乏跳脫,將潛在不安全的字串標記為安全,則可能會導致意想不到的結果。
在這種情況下,串聯 escape
不會重新跳脫已經被標記為安全的字串。
當使用操作序列的篩選器時,這一點尤其重要,例如 join
。如果您需要跳脫序列中的每個元素,請使用專用的 escapeseq
篩選器。
escapejs
¶
跳脫字元以用於整個 JavaScript 字串文字,無論是在單引號還是雙引號中,如下所示。此篩選器不會使字串在「JavaScript 樣板文字」(JavaScript 反引號語法)中使用時安全。不支援任何其他未列出的用法。一般建議使用 HTML data-
屬性或 json_script
篩選器傳遞資料,而不是嵌入在 JavaScript 中。
例如:
<script>
let myValue = '{{ value|escapejs }}'
escapeseq
¶
將 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
¶
當不帶參數使用時,會將浮點數四捨五入到小數點後一位,但僅當有小數部分要顯示時才會這樣做。例如:
|
範本 |
輸出 |
---|---|---|
|
|
|
|
|
|
|
|
|
如果使用數字整數參數,floatformat
會將數字四捨五入到指定的小數位數。例如:
|
範本 |
輸出 |
---|---|---|
|
|
|
|
|
|
|
|
|
特別有用的是傳遞 0 (零) 作為參數,這會將浮點數四捨五入到最接近的整數。
|
範本 |
輸出 |
---|---|---|
|
|
|
|
|
|
|
|
|
如果傳遞給 floatformat
的參數為負數,它會將數字四捨五入到指定的小數位數,但僅當有小數部分要顯示時才會這樣做。例如:
|
範本 |
輸出 |
---|---|---|
|
|
|
|
|
|
|
|
|
如果傳遞給 floatformat
的參數帶有 g
後綴,它會強制使用目前地區設定的 THOUSAND_SEPARATOR
進行分組。例如,當目前的地區設定為 en
(英文) 時:
|
範本 |
輸出 |
---|---|---|
|
|
|
|
|
|
|
|
|
除非傳遞給 floatformat
的參數帶有 u
後綴(這會強制停用本地化),否則輸出始終會被本地化(獨立於 {% localize off %}
標籤)。例如,當目前的地區設定為 pl
(波蘭文) 時:
|
範本 |
輸出 |
---|---|---|
|
|
|
|
|
|
不帶參數使用 floatformat
等同於使用參數為 -1
的 floatformat
。
force_escape
¶
將 HTML 跳脫應用於字串(詳細資訊請參閱 escape
篩選器)。此篩選器會立即應用並返回一個新的跳脫字串。這在您需要多次跳脫或想要將其他篩選器應用於跳脫結果的罕見情況下很有用。通常,您會想要使用 escape
篩選器。
例如,如果您想捕獲 linebreaks
篩選器建立的 <p>
HTML 元素:
{% autoescape off %}
{{ body|linebreaks|force_escape }}
{% endautoescape %}
get_digit
¶
給定一個整數,返回請求的數字,其中 1 是最右邊的數字,2 是第二個最右邊的數字,依此類推。對於無效的輸入(如果輸入或參數不是整數,或者如果參數小於 1),則返回原始值。否則,輸出始終為整數。
例如:
{{ value|get_digit:"2" }}
如果 value
是 123456789
,則輸出將為 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>&'}
,則輸出將會是
<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 }}
如果 value
是 Joel\nis a slug
,則輸出將會是 <p>Joel<br>is a slug</p>
。
linebreaksbr
¶
將一段純文字中的所有換行符號轉換為 HTML 換行符號(<br>
)。
例如:
{{ value|linebreaksbr }}
如果 value
是 Joel\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" }}"
如果 value
是 Django
,則輸出將會是 "Django "
。
lower
¶
將字串轉換為全部小寫。
例如:
{{ value|lower }}
如果 value
是 Totally LOVING this Album!
,則輸出將會是 totally loving this album!
。
make_list
¶
返回轉換為列表的值。對於字串,它是一個字元列表。對於整數,會在建立列表之前將參數轉換為字串。
例如:
{{ value|make_list }}
如果 value
是字串 "Joel"
,則輸出將會是列表 ['J', 'o', 'e', 'l']
。如果 value
是 123
,則輸出將會是列表 ['1', '2', '3']
。
phone2numeric
¶
將電話號碼(可能包含字母)轉換為其數字等效值。
輸入不一定要是有效的電話號碼。這將會很樂意地轉換任何字串。
例如:
{{ value|phone2numeric }}
如果 value
是 800-COLLECT
,則輸出將會是 800-2655328
。
pluralize
¶
如果值不是 1
、'1'
或長度為 1 的物件,則返回複數後綴。預設情況下,此後綴為 's'
。
範例
You have {{ num_messages }} message{{ num_messages|pluralize }}.
如果 num_messages
是 1
,則輸出將會是 You have 1 message.
。如果 num_messages
是 2
,則輸出將會是 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" }}"
如果 value
是 Django
,則輸出將會是 " 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" }}
如果 value
是 10
,則輸出將會是 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
將輸入限制為前五百萬個字元。
在較舊的版本中,會處理超過五百萬個字元的字串。
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
將輸入限制為前五百萬個字元。
在較舊的版本中,會處理超過五百萬個字元的字串。
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
。如果 autoescape
是 True
,連結文字和 URL 將使用 Django 的內建 escape
篩選器進行逸出。autoescape
的預設值為 True
。
注意
如果 urlize
套用至已包含 HTML 標記的文字,或套用至包含單引號('
)的電子郵件地址,則結果不會如預期。僅將此篩選器套用至純文字。
警告
使用 urlize
或 urlizetrunc
可能會產生效能損失,當套用至使用者控制的值(例如儲存在 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 }}
如果 value
是 Joel is a slug
,輸出將會是
Joel
is a
slug
yesno
¶
將 True
、False
和(選擇性的)None
的值對應到字串「yes」、「no」、「maybe」或以逗號分隔的清單形式傳遞的自訂對應,並根據值傳回其中一個字串
例如:
{{ value|yesno:"yeah,no,maybe" }}
值 |
參數 |
輸出 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
國際化標籤和篩選器¶
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()
方法提供檔案,此方法由 STORAGES
中 staticfiles
指定的儲存空間所提供。例如:
{% 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 環境中使用它,它會被適當轉義。