測試開發之Django——No6.Django模板中的標籤語言
模板中的標籤語言
1.if/else
{% if %} 標籤檢查(evaluate)一個變數,如果這個變數為真(即:變數存在,非空,不是布林值假),系統會顯示在{% if %} 和
{% endif %}直接的任何內容。
例如:
{% if a %}
<p>Welcome to the weekend!</p>
{% endif %}
{% else %} 和 {% elif %} 標籤是可選的
當然,是在根據需要來決定是否需要使用這個標籤
2.布林運算子
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 %}
允許在同一標記內使用both 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
== 運算子:等於
!= 運算子:不等於
> 運算子:大於
< 運算子:小於
<= 運算子:小於等於
>= 運算子:大於等於
in 運算子:包含在內
not in 運算子:不包含
is 運算子:物件身份的判斷,測試兩個只是否是同一個物件
not is 運算子:測試兩個是是否不是同一個物件
表示式的運算子優先規則(優先順序從低到高):
or and not in == != < > <= >=
模板系統中,只有下面幾種情況的布林值是False:
1)空列表
2)空元組
3)空字串
4)零值
5)特殊物件none
6)物件false
3.for
迴圈遍歷陣列中的每個專案,使專案在上下文變數中可用。例如,要顯示以下提供的運動員列表 athlete_list
:
<ul> {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% endfor %} </ul>
您可以使用反向迴圈遍歷列表 。{% for obj in list reversed %}
如果需要迴圈列表列表,可以將每個子列表中的值解壓縮為單個變數。例如,如果您的上下文包含呼叫的(x,y)座標列表points
,則可以使用以下內容輸出點列表:
{% for x, y in points %} There is a point at {{ x }},{{ y }} {% endfor %}
for迴圈設定迴圈中可用的許多變數:
變數 | 描述 |
---|---|
forloop.counter |
迴圈的當前迭代(1索引) |
forloop.counter0 |
迴圈的當前迭代(0索引) |
forloop.revcounter |
迴圈結束時的迭代次數(1索引) |
forloop.revcounter0 |
迴圈結束時的迭代次數(0索引) |
forloop.first |
如果這是第一次通過迴圈,則為真 |
forloop.last |
如果這是最後一次迴圈,則為真 |
forloop.parentloop |
對於巢狀迴圈,這是圍繞當前迴圈的迴圈 |
該for
標籤可以使用一個可選條款,其文字顯示,如果給定的陣列為空或無法找到:{% empty %}
<ul> {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% empty %} <li>Sorry, no athletes in this list.</li> {% endfor %} </ul>
4 autoescape
控制當前的自動轉義行為。此標記採用on
或 off
作為引數,並確定自動轉義是否在塊內生效。該塊以endautoescape
結束標記關閉。
當自動轉義生效時,所有變數內容都會在將結果放入輸出之前對其應用HTML轉義(但在應用任何過濾器之後)。這相當於手動將escape
過濾器應用於每個變數。
唯一的例外是已經標記為“安全”的變數,無論是通過填充變數的程式碼,還是因為它已經應用了safe
或escape
過濾器。
{% autoescape on %} {{ body }} {% endautoescape %}
5.block
定義可由子模板覆蓋的塊,例如:
{% block title %}{{ section.title }}{% endblock %}
6.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
標籤不能巢狀
7.csrf_token
此標記用於CSRF保護
8.extends
表示此模板擴充套件父模板的訊號。
此標記可以以兩種方式使用:
{% extends "base.html" %}
(帶引號)使用文字值"base.html"
作為要擴充套件的父模板的名稱。{% extends variable %}
使用的值variable
。如果變數求值為字串,Django將使用該字串作為父模板的名稱。如果變數求值為一個Template
物件,Django將使用該物件作為父模板。
有關更多資訊,請參見模板繼承。
通常,模板名稱相對於模板載入器的根目錄。字串引數也可以是以./
或開頭的相對路徑../
。
9.include
載入模板並使用當前上下文呈現它。這是一種在模板中“包含”其他模板的方法。
模板名稱可以是單引號或雙引號中的變數或硬編碼(帶引號)字串。
此示例包含模板的內容"foo/bar.html"
:
{% include "foo/bar.html" %}
您可以使用關鍵字引數將其他上下文傳遞給模板:
{% include "name_snippet.html" with person="Jane" greeting="Hello" %}
10.load
載入自定義模板標記集。
{% load static %}
載入靜態資原始檔
11.now
使用根據給定字串的格式顯示當前日期和/或時間。此類字串可以包含格式說明符字元,如date
過濾器部分中所述。
It is {% now "jS F Y H:i" %}
請注意,如果要使用“原始”值,則可以反斜槓轉義格式字串。在此示例中,“o”和“f”都是反斜槓轉義的,因為否則每個都是一個格式字串,分別顯示年份和時間:
It is the {% now "jS \o\f F" %}
您還可以使用語法將輸出(作為字串)儲存在變數中。如果要在模板標記內部使用 ,例如:{% now "Y" ascurrent_year %}
{% now %}
blocktrans
{% now "Y" as current_year %} {% blocktrans %}Copyright {{ current_year }}{% endblocktrans %}
12.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 %}
cities
country
country_list
{% regroup %}
生成一個組物件的列表(在本例中country_list
) 。組物件是包含兩個欄位的例項 :namedtuple()
grouper
- 按分組的專案(例如,字串“India”或“Japan”)。list
- 該組中所有專案的列表(例如,所有具有country ='India'的城市的列表)。
使用dictsort
過濾器對模板中的資料進行排序 ,如果您的資料位於詞典列表中
{% regroup cities|dictsort:"country" by country as country_list %}
對其他屬性進行分組
任何有效的模板查詢都是regroup標記的合法分組屬性,包括方法,屬性,字典鍵和列表項。例如,如果“country”欄位是具有屬性“description”的類的外來鍵,則可以使用
{% regroup cities by country.description as country_list %}
13.url
返回與給定檢視和可選引數匹配的絕對路徑引用(不帶域名的URL)。將使用編碼生成的路徑中的任何特殊字元iri_to_uri()
。
這是一種通過在模板中對URL進行硬編碼來輸出連結而不違反DRY原則的方法:
{% url 'some-url-name' v1 v2 %}
第一個引數是URL模式名稱。它可以是帶引號的文字或任何其他上下文變數。其他引數是可選的,應該是空格分隔的值,將用作URL中的引數。上面的例子顯示了傳遞位置引數。或者,您可以使用關鍵字語法:
{% url 'some-url-name' arg1=v1 arg2=v2 %}
14.widthratio
對於建立條形圖等,此標記計算給定值與最大值的比率,然後將該比率應用於常量。
如果this_value
是175,max_value
是200,並且max_width
是100,則上例中的影象將是88畫素寬(因為175/200 = .875; .875 * 100 = 87.5,其被舍入到88)。
在某些情況下,您可能希望捕獲widthratio
變數的結果。例如,它可以是blocktrans
這樣的:
{% widthratio this_value max_value max_width as width %} {% blocktrans %}The width is: {{ width }}{% endblocktrans %}
15.with
以更簡單的名稱快取複雜變數。這在多次訪問“昂貴”方法(例如,擊中資料庫的方法)時很有用。
{% with total=business.employees.count %} {{ total }} employee{{ total|pluralize }} {% endwith %}
填充的變數(在上面的示例中total
)僅在和標記之間可用。{% with %}
{% endwith %}
您可以分配多個上下文變數:
{% with alpha=1 beta=2 %} ... {% endwith %}