1. 程式人生 > >測試開發之Django——No6.Django模板中的標籤語言

測試開發之Django——No6.Django模板中的標籤語言

模板中的標籤語言

 

1.if/else

{% if  %} 標籤檢查(evaluate)一個變數,如果這個變數為真(即:變數存在,非空,不是布林值假),系統會顯示在{% if  %} 和

{% endif %}直接的任何內容。

例如:

{% if a %}

  <p>Welcome to the weekend!</p>

{% endif %}

{% else %} 和 {% elif %} 標籤是可選的

當然,是在根據需要來決定是否需要使用這個標籤

 

2.布林運算子

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

允許在同一標記內使用both andor子句, 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 inisis 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>

  

autoescape

控制當前的自動轉義行為。此標記採用on或 off作為引數,並確定自動轉義是否在塊內生效。該塊以endautoescape結束標記關閉

當自動轉義生效時,所有變數內容都會在將結果放入輸出之前對其應用HTML轉義(但在應用任何過濾器之後)。這相當於手動將escape 過濾器應用於每個變數。

唯一的例外是已經標記為“安全”的變數,無論是通過填充變數的程式碼,還是因為它已經應用safeescape過濾器。

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