1. 程式人生 > >django 內建標籤與過濾器

django 內建標籤與過濾器

部落格遷移:http://blog.timeash.cn 文章更精彩

內建標籤與過濾器

本文件介紹了Django的內建模板標籤和過濾器。 我們推薦儘可能使用 自動文件,同時也可以自行編輯任何已安裝的自定義標籤或過濾器的文件。

內建標記引用

autoescape

控制自動轉義是否可用.這種標籤帶有任何 on 或 off 作為引數的話,他將決定轉義塊內效果。該標籤會以一個endautoescape作為結束標籤.

當自動轉義生效時,所有變數內容會被轉義成HTML輸出(在所有過濾器生效後)這等同與手動將escape篩選器應用於每個變數。

唯一一個例外是,變數或者通過渲染變數的程式碼,或者因為它已經應用了 safe或escape過濾器,已經被標記為“safe”。

例如:

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

block

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

這個標籤用於跨站請求偽造保護, 具體可以參考Cross Site Request Forgeries中的描述。

cycle

每當這個標籤被訪問,則傳出一個它的可迭代引數的元素。第一次訪問返回第一個元素,第二次訪問返回第二個引數,以此類推.一旦所有的變數都被訪問過了,就會回到最開始的地方,重複下去

這個標籤在迴圈中特別有用:

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

第一次迭代產生的HTML引用了 row1類,第二次則是row2類,第三次 又是row1 類,如此類推。

你也可以使用變數,例如,如果你有兩個模版變數, rowvalue1和rowvalue2, 你可以讓他們的值像這樣替換:

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

被包含在cycle中的變數將會被轉義。你可以禁止自動轉義:

{% 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 標籤中,通過空格分割,你可以使用任意數量的值。被包含在單引號 (‘)或者雙引號 (“) 中的值被認為是可迭代字串,相反,沒有被引號包圍的值被當作模版變數。

預設情況下,當你在cycle標籤中使用as 關鍵字時,關於{% cycle %}的使用,會啟動cycle並且直接產生第一個值。如果你想要在巢狀迴圈中或者included模版中使用這個值,那麼將會遇到困難。如果你只是想要宣告cycle,但是不產生第一個值,你可以新增一個silent關鍵字來作為cycle標籤的最後一個關鍵字。例如:

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

這將輸出元素的列表,其中class在row1和row2之間交替。子模板將在其上下文中訪問rowcolors,並且該值將匹配包圍它的的類。如果省略silent關鍵字,則row1和row2將作為正常文字發出,

當在迴圈定義上使用silent關鍵字時,靜默將自動應用於該特定週期標記的所有後續使用。

The following template would output nothing, even though the second call to {% cycle %} doesn’t specify silent:

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

為了向後相容,{% cycle %}標記支援來自以前Django版本的劣質舊語法。你不應該在任何新專案中使用它,但是為了仍在使用它的人,這裡是它的樣子:

{% cycle row1,row2,row3 %}

在這裡,每個值都是字串,並且無法置頂變數名或者直接的逗號或空格。我們提到你不應該在任何新專案中使用這種語法?

debug

輸出整個除錯資訊,包括當前上下文和匯入的模組。

extends

表示當前模板繼承自一個父模板

這個標籤可以有兩種用法:

    {% extends "base.html" %} (要有引號).繼承名為"base.html"的父模板
    {% extends variable %} 使用variable的值. 如果變數被計算成一個字串,Django將會把它看成是父模版的名字。如果變數被計算到一個Template物件,Django將會使用那個物件作為一個父模版。

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,就什麼也不輸出。

簡單用例:

{% firstof var1 var2 var3 %}

它等價於:

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

當然你也可以用一個預設字串作為輸出以防傳入的所有變數都是False:

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

標籤auto-escapes是開啟的, 你可以這樣關閉auto-escaping:

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

如果只想要部分變數被規避,可以這樣使用:

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

for

迴圈組中的每一個專案,並讓這些專案在上下文可用。 舉個例子,展示athlete_list中的每個成員:

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

可以利用{% for obj in list reversed %}反向完成迴圈。

如果你需要迴圈一個包含列表的列表,可以通過拆分每一個二級列表為一個獨立變數來達到目的。 舉個例子,如果你的內容包括一個叫做points的(x,y) 列表,你可以像以下例子一樣輸出points列表:

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

如果你想訪問一個字典中的專案,這個方法同樣有用。舉個例子:如果你的內容包含一個叫做data的字典,下面的方式可以輸出這個字典的鍵和值:

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

The current iteration of the loop (1-indexed)
Variable Description
forloop.counter The current iteration of the loop (1-indexed)
forloop.counter0 The current iteration of the loop (0-indexed)
forloop.revcounter The number of iterations from the end of the loop (1-indexed)
forloop.revcounter0 The number of iterations from the end of the loop (0-indexed)
forloop.first True if this is the first time through the loop
forloop.last True if this is the last time through the loop
forloop.parentloop For nested loops, this is the loop surrounding the current one
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”(存在、不為空、且不是boolean型別的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 }}過濾器展示出athletes的數量。

正如你所見,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 ,他們作用如下:
==運算子

相等。例:

{% 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容器支援此運算子,以測試給定值是否在容器中。以下是在 t> y中如何解釋x 的一些示例:

{% 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運算子的否定操作。

比較運算子不能像Python或數學符號中那樣“連結”。例如,不能使用:

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

你應該使用:

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

過濾器

你也可以在 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 標籤。有時,為了清楚起見,更好的是為了那些不知道優先規則的人。

ifchanged

檢查一個值是否在上一次的迭代中改變。

{% ifchanged %} 塊標籤用在迴圈裡。它可能有兩個用處:
檢查它已經渲染過的內容中的先前狀態。並且只會顯示發生改變的內容。例如, 以下的程式碼是輸出days的列表項,不過它只會輸出被修改過月份的項:

    <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 %}

ifequal

如果給定的兩個引數是相等的,則顯示被標籤包含的內容.

舉個例子:

{% ifequal user.pk comment.user_id %}
    ...
{% endifequal %}

在 if 標籤裡面, 也可以包含 {% else %} 標籤選項.

引數可以是一個硬編碼的字串,所以也可以這樣:

{% ifequal user.username "adrian" %}
    ...
{% endifequal %}

ifequal標記的替代方法是使用if標記和==運算子。

ifnotequal

就像ifequal,不過它測試兩個引數不相等。

ifnotequal標記的替代方法是使用if標記和!=運算子。
include

載入模板並以標籤內的引數渲染。這是一種可以引入別的模板的方法。

模板名可以是變數或者是硬編碼的字串,可以用單引號也可以是雙引號.

下面這個示例包括模板“foo/bar.html”的內容:

{% include “foo/bar.html” %}

此示例包括其名稱包含在變數template_name中的模板的內容:

{% include template_name %}

Changed in Django 1.7:

變數也可以是任何實現了render() 方法介面的物件,這個物件要可以接收上下文(context)。這就允許你在context中引用一個已經被編譯過的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中”的變種方法,而不是認為是”解析子模版並在被父模版包含的情況下展現其被父模版定義的內容”.這意味著在不同的被包含的子模版之間並不共享父模版的狀態,每一個子包含都是完全獨立的渲染過程.

Block模組在被包含 之前 就已經被執行. 這意味著模版在被包含之前就已經從另一個block擴充套件並 已經被執行並完成渲染 - 沒有block模組會被include引入並執行,即使父模版中的擴充套件模版.
load

載入自定義模板標籤集。

舉個例子, 下面這模板將會從package包中載入所有somelibrary 和otherlibrary 中已經註冊的標籤和過濾器:

{% load somelibrary package.otherlibrary %}

你還可以使用from引數從庫中選擇性載入單個過濾器或標記。在下面這個示例中,名為foo和bar的模板標籤/過濾器將從somelibrary載入:

{% load foo bar from somelibrary %}

有關詳細資訊,請參閱自定義標記和過濾器庫。
lorem
New in Django 1.8:

該標籤之前位於django.contrib.webdesign中。

展示隨機的“lorem ipsum”拉丁文字. 這個標籤是用來在模版中提供文字樣本以供測試用的.

用法:

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

可以使用零個,一個,兩個或三個引數使用{% lorem %} 。這些引數是:
Argument Description
count A number (or variable) containing the number of paragraphs or words to generate (default is 1).
method Either w for words, p for HTML paragraphs or b for plain-text paragraph blocks (default is b).
random The word random, which if given, does not use the common paragraph (“Lorem ipsum dolor sit amet…”) when generating text.

例子:

{% lorem %}將輸出常見的“lorem ipsum”段落。
{% lorem 3 p %} 輸出常見的“lorem ipsum”段落和兩個隨機段落,每個段落包含在HTML <p>標籤中。
{% lorem 2 w 隨機 %} / t6>將輸出兩個隨機拉丁字。

now

顯示最近的日期或事件,可以通過給定的字串格式顯示。此類字串可以包含格式說明符字元,如date過濾器部分中所述。

例:

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

注意!,如果你想要使用“raw”值,你能夠反斜槓轉義一個格式化字串。在這個例子中,“o”和“f”都是反斜槓轉義,因為如果不這樣,會分別顯示年和時間:

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

這將顯示為“這是9月4日”。

注意

傳遞的格式也可以是預定義的DATE_FORMAT,DATETIME_FORMAT,SHORT_DATE_FORMAT或SHORT_DATETIME_FORMAT之一。預定義的格式可能會因當前語言環境和格式本地化的啟用而有所不同,例如:

It is {% now “SHORT_DATETIME_FORMAT” %}

You can also use the syntax {% now “Y” as current_year %} to store the output inside a variable.This is useful if you want to use {% now %} inside a template tag like blocktrans for example:

{% now “Y” as current_year %}
{% blocktrans %}Copyright {{ current_year }}{% endblocktrans %}

New in Django 1.8.

添加了使用“as”語法的能力。
regroup

用相似物件間共有的屬性重組列表.

用一個例子來解釋這種複雜的標籤是最好的方法:假如“places”是一個包含了”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’},
]

你會希望用下面這種方式來展示國家和城市的資訊

India
    孟買:19,000,000
    加爾各答:15,000,000
USA
    紐約:20,000,000
    芝加哥:7,000,000
Japan
    東京:33,000,000

你可以使用{% regroup %}標籤來給每個國家的城市分組。以下模板程式碼片段將實現這一點:

{% regroup cities by country as country_list %}

    {% for country in country_list %}
  • {{ country.grouper }}
      {% for item in country.list %}
    • {{ item.name }}: {{ item.population }}
    • {% endfor %}
  • {% endfor %}

讓我們來看看這個例子。{% regroup %}有三個引數: 你想要重組的列表, 被分組的屬性, 還有結果列表的名字. 在這裡,我們通過country屬性重新分組cities列表,並呼叫結果country_list。

{% regroup %}產生一個清單(在本例中為country_list的組物件。每個組物件有兩個屬性:

grouper - 按分組的專案(例如,字串“India”或“Japan”)。
list - 此群組中所有專案的列表(例如,所有城市的列表,其中country ='India')。

請注意,{% 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 %}以上將導致以下輸出:

India
    孟買:19,000,000
USA
    紐約:20,000,000
India
    加爾各答:15,000,000
USA
    芝加哥:7,000,000
Japan
    東京:33,000,000

這個問題的最簡單的解決方案是確保在你的檢視程式碼中,資料是根據你想要顯示的順序排序。

另一個解決方案是使用dictsort過濾器對模板中的資料進行排序,如果您的資料在字典列表中:

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

Grouping on other properties

一個有效的模版查詢是一個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
spaceless

刪除HTML標籤之間的空白格.包括製表符和換行.

用法示例:

{% spaceless %}


Foo


{% endspaceless %}

這個示例將返回下面的HTML:

Foo

僅刪除 tags 之間的空格 – 而不是標籤和文字之間的。在此示例中,Hello周圍的空格不會被刪除:

{% spaceless %}

Hello

{% endspaceless %}

ssi

從1.8以後不建議使用這標籤建議不再使用,將會在Django 2.0以後會被刪除。用 include標籤代替。

將給定檔案的內容輸出到頁面。

像一個簡單的include標籤,{% ssi %}在當前頁面中的另一個檔案 - 必須使用絕對路徑指定:

{% ssi ‘/home/html/ljworld.com/includes/right_generic.html’ %}

ssi的第一個引數可以是引用的文字或任何其他上下文變數。

如果給出了可選的parsed引數,則在當前上下文中,將包含檔案的內容作為模板程式碼進行評估:

{% ssi ‘/home/html/ljworld.com/includes/right_generic.html’ parsed %}

Note that if you use {% ssi %}, you’ll need to define ‘allowed_include_roots’ in the OPTIONS of your template engine, as a security measure.

注意

使用ssi標記和parsed引數,檔案之間沒有共享狀態 - 每個包含是一個完全獨立的呈現過程。這意味著例如不可能使用包含的檔案來定義塊或改變當前頁面中的上下文。

另請參閱:{% include %}。
templatetag

輸出用於構成模板標記的語法字元之一。

由於模板系統沒有“轉義”的概念,為了顯示模板標籤中使用的一個位,必須使用{% templatetag %}標記。

引數指定要輸出哪個模板位:
Argument Outputs
openblock {%
closeblock %}
openvariable {{
closevariable }}
openbrace {
closebrace }
opencomment {#
closecomment #}

樣品用量:

{% templatetag openblock %} url ‘entry_list’ {% templatetag closeblock %}

url

返回一個絕對路徑的引用(不包含域名的URL),該引用匹配一個給定的檢視函式和一些可選的引數。在解析後返回的結果路徑字串中,每個特殊字元將使用iri_to_uri()編碼。

這是一種不違反DRY原則的輸出連結的方式,它可以避免在模板中硬編碼連結路徑。

{% url ‘some-url-name’ v1 v2 %}

第一個引數是檢視函式中包名.模組名.函式名這樣的路徑package.package.module.function. 它可以是一個被引號引起來的字串或者其他的上下文變數. 其他引數是可選的並且應該以空格隔開,這些值會在URL中以引數的形式傳遞. 上面的例子展示瞭如何傳遞位置引數.當然你也可以使用關鍵字引數.

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

不要把位置引數和關鍵字引數混在一起使用。URLconf所需的所有引數都應該存在。

例如,假設您有一個檢視app_views.client,其URLconf接受客戶端ID(此處client()是檢視檔案app_views .py)。URLconf行可能如下所示:

(‘^client/([0-9]+)/$’, ‘app_views.client’, name=’app-views-client’)

如果你的應用中的URLconf 已經被包含到專案 URLconf 中,比如下面這樣

(‘^clients/’, include(‘project_name.app_name.urls’))

…那麼, 在模板檔案中, 你可以很方便的建立一個接指該檢視的超連結,示例如下

{% url ‘app-views-client’ client.id %}

模板標籤會輸出如下的字串 /clients/client/123/.

如果您使用命名的網址格式,則可以參考網址標記中的模式名稱,而不是使用檢視的路徑。

請注意,如果您要撤消的網址不存在,您會收到NoReverseMatch異常,這會導致您的網站顯示錯誤網頁。

如果您希望在不顯示網址的情況下檢索網址,則可以使用略有不同的呼叫:

{% url ‘some-url-name’ arg arg2 as the_url %}

I’m linking to {{ the_url }}

The scope of the variable created by the as var syntax is the {% block %} in which the {% url %} tag appears.

此{% url …為var%}語法將不導致錯誤,如果檢視丟失。實際上,您將使用此連結來連結到可選的檢視:

{% url ‘some-url-name’ as the_url %}
{% if the_url %}
Link to optional stuff
{% endif %}

如果您要檢索名稱空間網址,請指定完全限定名稱:

{% url ‘myapp:view-name’ %}

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

自1.8版起已棄用:點狀Python路徑語法已棄用,將在Django 2.0中刪除:

{% url ‘path.to.some_view’ v1 v2 %}

警告

不要忘記在函式路徑或模式名稱周圍加引號,否則值將被解釋為上下文變數!
verbatim

停止模版引擎在該標籤中的渲染/

常見的用法是允許與Django語法衝突的JavaScript模板圖層。例如:

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

You can also designate a specific closing tag, allowing the use of {% endverbatim %} as part of the unrendered contents:

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

widthratio

為了建立條形圖等,此標籤計算給定值與最大值的比率,然後將該比率應用於常量。

例如:

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

自1.8版起已棄用:還支援舊的,更限制性和詳細的輸入格式:[‘States’, [[‘Kansas’, t> []], [‘Topeka’, []]]], t7> []]]]。這種語法在Django 2.0 中將不再支援。
upper

將字串轉換為大寫形式:

例如:

{{ value|upper }}

如果value是“Joel 是 a >,輸出將為“JOEL IS A SLUG”。

urlencode

轉義要在URL中使用的值。

例如:

{{ value|urlencode }}

If value is “http://www.example.org/foo?a=b&c=d“, the output will be “http%3A//www.example.org/foo%3Fa%3Db%26c%3Dd”.

可以提供包含不應該轉義的字元的可選引數。

如果未提供,則’/’字元被假定為安全的。當所有字元應該轉義時,可以提供空字串。例如:

{{ value|urlencode:"" }}

如果value為”http://www.example.org/“,輸出將為”http%3A%2F%2Fwww.example.org%2F”。

urlize

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

此模板程式碼適用於以http://,https://或www.為字首的連結。例如,http://goo.gl/aia1t會得到轉換,但goo.gl/aia1t不會。

它還支援以原始頂級域(.com,.edu,.gov,.int,.mil,.net和.org)。例如,djangoproject.com被轉換。
Changed in Django 1.8:

支援新增包含頂級域名後面的字元(例如,djangoproject.com/和djangoproject.com/download/)的純域連結。

連結可以具有結尾標點符號(句點,逗號,近括號)和前導標點符號(開頭括號),urlize仍然可以做正確的事。

由urlize生成的連結會向其中新增rel=”nofollow”屬性。

例如:

{{ value|urlize }}

如果value是“檢查 出 www.djangoproject.com” 將“檢查 出 &lt; a href =”http://www.djangoproject.com“ t10> rel =“nofollow”&gt; www.djangoproject.com&lt; / a&gt;“。

除了網路連結,urlize還會將電子郵件地址轉換為mailto:連結。如果value是“傳送 問題 到 [email protected]” t6 >,輸出將是“傳送 問題 到 &lt; a href =“mailto:[email protected]”&gt; [email protected]&lt; / a&gt;“。

urlize過濾器還採用可選引數autoescape。如果autoescape是True,則使用Django的內建escape過濾器轉義連結文字和網址。autoescape的預設值為True。

注意

如果urlize應用於已經包含HTML標記的文字,則會無法正常工作。僅將此過濾器應用於純文字。
urlizetrunc

將網址和電子郵件地址轉換為可點選的連結,就像urlize,但截斷長度超過給定字元數限制的網址。

引數:連結文字的字元數應截短為,包括如果截斷是必要的,新增的省略號。

例如:

{{ value|urlizetrunc:15 }}

If value is “Check out www.djangoproject.com”, the output would be ‘Check out www.djangopr…‘.

與urlize一樣,此過濾器應僅應用於純文字。
wordcount

返回字數。

例如:

{{ value|wordcount }}

如果value是“Joel 是 a >,輸出將為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” }}

Value Argument Outputs
True yes
True “yeah,no,maybe” yeah
False “yeah,no,maybe” no
None “yeah,no,maybe” maybe
None “yeah,no” no (converts None to False if no mapping for None is given)
國際化標籤和過濾器

Django提供模板標記和過濾器,以控制模板中internationalization的每個方面。它們允許對翻譯,格式化和時區轉換進行粒度控制。
i18n

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

請參閱Internationalization: in template code中。
l10n

此庫提供對模板中值的本地化的控制。您只需要使用{% load l10n %}但您通常會將USE_L10N設定為True,以便本地化預設處於活動狀態。

請參閱Controlling localization in templates。
tz

此庫提供對模板中時區轉換的控制。像l10n,您只需要使用{% load tz },但通常還會將USE_TZ設定為True,以便預設情況下會轉換為本地時間。

請參閱Time zone aware output in templates。
其他標籤和過濾器庫

Django附帶了一些其他模板標記庫,您必須在INSTALLED_APPS設定中顯式啟用,並在您的模板中啟用{% load %}標記。
django.contrib.humanize

一組Django模板過濾器,用於向資料新增“人性化”。請參閱django.contrib.humanize。
django.contrib.webdesign

在設計網站時有用的模板標籤集合,例如Lorem Ipsum文字生成器。請參閱django.contrib.webdesign。
靜態的

static

要連結儲存在STATIC_ROOT中的靜態檔案,Django附帶了static模板標記。無論是否使用RequestContext,您都可以使用此方法。

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

它還能夠消耗標準上下文變數,例如。假設將user_stylesheet變數​​傳遞給模板:

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

如果您希望在不顯示靜態網址的情況下檢索靜態網址,則可以使用略有不同的呼叫:

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

注意

The staticfiles contrib app also ships with a static template tag which uses staticfiles’ STATICFILES_STORAGE to build the URL of the given path (rather than simply using urllib.parse.urljoin() with the STATIC_URL setting and the given path). 如果您有高階用例(例如using a cloud service to serve static files),請改用此方法:

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

get_static_prefix

您應該選擇static靜態模板標記, 但如果需要對 STATIC_URL 在模板中的確切位置和方式進行更多的控制, 則可以使用 get_static_prefix 模板標記:

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