if/else 標籤 | for 標籤 | ifequal/ifnotequal 標籤 |
註釋標籤 | 過濾器 | include 標籤 |
URL標籤 | 模板繼承 |
1. 基本語法格式以下:
{% if condition %}
... display
{% endif %}
或者:服務器
{% if condition1 %}
... display 1
{% elif condiiton2 %}
... display 2
{% else %}
... display 3
{% endif %}
根據條件判斷是否輸出。if/else 支持嵌套。app
Note:模板標籤中的變量是不用{{}}包含的。框架
2. {% if %} 標籤接受 and , or 或者 not 關鍵字來對多個變量作判斷 ,或者對變量取反( not ),例如:oop
{% if athlete_list and coach_list %}
athletes 和 coaches 變量都是可用的。
{% endif %}
Note:性能
1. {% if %} 標籤不容許在同一個標籤中同時使用 and 和 or ,由於邏輯上可能模糊的,這樣的代碼是不合法的:網站
{% if athlete_list and coach_list or cheerleader_list %}
2. 系統不支持用圓括號來組合比較操做。 若是你確實須要用到圓括號來組合表達你的邏輯式,考慮將它移到模板以外處理,而後以模板變量的形式傳入結果吧。 或者,僅僅用嵌套的{%if%}標籤替換ui
TOP
for 標籤this
1. {% for %} 容許咱們在一個序列上迭代。與Python的 for 語句的情形相似,循環語法是 for X in Y ,Y是要迭代的序列而X是在每個特定的循環中使用的變量名稱。
每一次循環中,模板系統會渲染在 {% for %} 和 {% endfor %} 之間的全部內容。
例如,給定一個運動員列表 athlete_list 變量,咱們可使用下面的代碼來顯示這個列表:
<ul>
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% endfor %}
</ul>
2. 給標籤增長一個 reversed 使得該列表被反向迭代:
{% for athlete in athlete_list reversed %}
3. 能夠嵌套使用 {% for %} 標籤。
在執行循環以前先檢測列表的大小是一個一般的作法,當列表爲空時輸出一些特別的提示。`` for`` 標籤支持一個可選的`` {% empty %}`` 分句,經過它咱們能夠定義當列表爲空時的輸出內容 下面的例子與用if-else實現等價:
{% for athlete in athlete_list %}
<p>{{ athlete.name }}</p>
{% empty %}
<p>There are no athletes. Only computer programmers.</p>
{% endfor %}
4. Django不支持退出循環操做。 若是咱們想退出循環,能夠改變正在迭代的變量,讓其僅僅包含須要迭代的項目。 同理,Django也不支持continue語句,咱們沒法讓當前迭代操做跳回到循環頭部。
5.在每一個`` {% for %}``循環裏有一個稱爲`` forloop`` 的模板變量。這個變量有一些提示循環進度信息的屬性。
forloop.counter 老是一個表示當前循環的執行次數的整數計數器。 這個計數器是從1開始的,因此在第一次循環時forloop.counter 將會被設置爲1。
{% for item in todo_list %}
<p>{{ forloop.counter }}: {{ item }}</p>
{% endfor %}
forloop.counter0 相似於forloop.counter ,可是它是從0計數的。 第一次執行循環時這個變量會被設置爲0。
forloop.revcounter 是表示循環中剩餘項的整型變量。 在循環初次執行時forloop.revcounter 將被設置爲序列中項的總數。 最後一次循環執行中,這個變量將被置1。
forloop.revcounter0 相似於forloop.revcounter ,但它以0作爲結束索引。在第一次執行循環時,該變量會被置爲序列的項的個數減1。
forloop.first 是一個布爾值,若是該迭代是第一次執行,那麼它被置爲```` 在下面的情形中這個變量是頗有用的:
System Message: WARNING/2 (<string>, line 1071);backlink
Inline literal start-string without end-string.
{% for object in objects %}
{% if forloop.first %}<li class="first">{% else %}<li>{% endif %}
{{ object }}
</li>
{% endfor %}
forloop.last 是一個布爾值;在最後一次執行循環時被置爲True。 一個常見的用法是在一系列的連接之間放置管道符(|),另外一個常見的用途是爲列表的每一個單詞的加上逗號。
{% for link in links %}{{ link }}{% if not forloop.last %} | {% endif %}{% endfor %}
上面的模板可能會產生以下的結果:
Link1 | Link2 | Link3 | Link4
forloop.parentloop 是一個指向當前循環的上一級循環的forloop 對象的引用(在嵌套循環的狀況下)。
{% for country in countries %}
<table>
{% for city in country.city_list %}
<tr>
<td>Country #{{ forloop.parentloop.counter }}</td>
<td>City #{{ forloop.counter }}</td>
<td>{{ city }}</td>
</tr>
{% endfor %}
</table>
{% endfor %}
forloop 變量僅僅可以在循環中使用。 在模板解析器碰到{%endfor%}標籤後,forloop就不可訪問了。
6. Context和forloop變量
在一個 {% for%} 塊中,已存在的變量會被移除,以免forloop 變量被覆蓋。 Django會把這個變量移動到forloop.parentloop 中。一般咱們不用擔憂這個問題,可是一旦咱們在模板中定義了forloop 這個變量(固然咱們反對這樣作),在{%for%} 塊中它會在forloop.parentloop 被從新命名。
ifequal/ifnotequal 標籤
1. {% ifequal %} 標籤比較兩個值,當他們相等時,顯示在 {% ifequal %} 和 {% endifequal %} 之中全部的值。
下面的例子比較兩個模板變量 user 和 currentuser :
{% ifequal user currentuser %}
<h1>Welcome!</h1>
{% endifequal %}
Note:只有模板變量,字符串,整數和小數能夠做爲 {% ifequal %} 標籤的參數。其餘任何類型,例如Python的字典類型、列表類型、布爾類型,不能用在{%ifequal%} 中。
2. {% ifequal %} 支持可選的 {% else%} 標籤:8
{% ifequal section 'sitenews' %}
<h1>Site News</h1>
{% else %}
<h1>No News Here</h1>
{% endifequal %}
{# 這是一個註釋 #}
用這種語法的註釋不能跨越多行。 這個限制是爲了提升模板解析的性能。 在下面這個模板中,輸出結果和模板自己是 徹底同樣的(也就是說,註釋標籤並無被解析爲註釋):
This is a {# this is not
a comment #}
test.
2. 實現多行註釋,可使用`` {% comment %}`` 模板標籤
{% comment %}
This is a
multi-line comment.
{% endcomment %}
過濾器
1. 模板過濾器能夠在變量被顯示前修改它,過濾器使用管道字符,以下所示:
{{ name|lower }}
{{ name }} 變量被過濾器 lower 處理後,文檔大寫轉換文本爲小寫。
2. 過濾管道能夠被* 套接* ,既是說,一個過濾器管道的輸出又能夠做爲下一個管道的輸入:
{{ my_list|first|upper }}
以上實例將第一個元素並將其轉化爲大寫。
Note:另外一種實現
{{ django|title }}
3. 有些過濾器有參數。 過濾器的參數跟隨冒號以後而且老是以雙引號包含。 例如:
{{ bio|truncatewords:"30" }}
這個將顯示變量 bio 的前30個詞。
4.linebreaks
Replaces line breaks in plain text with appropriate HTML; a singlenewline becomes an HTML line break (<br/>) and a new linefollowed by a blank line becomes a paragraph break (</p>).
For example:
{{ value|linebreaks }}
If value is Joel\nis a slug, the output will be<p>Joel<br/>is aslug</p>.
linebreaksbr
Converts all newlines in a piece of plain text to HTML line breaks(<br/>).
For example:
{{ value|linebreaksbr }}
If value is Joel\nis a slug, the output will beJoel<br/>isaslug.
5. 其餘過濾器:
addslashes : 添加反斜槓到任何反斜槓、單引號或者雙引號前面。
date : 按指定的格式字符串參數格式化 date 或者 datetime 對象,實例:
{{ pub_date|date:"F j, Y" }} #將變量ship_date傳遞給date過濾器,同時指定參數」F j,Y」。date過濾器根據參數進行格式輸出。如時間的顯示 April 2, 2009 是按 'F j, Y' 格式顯示的。
length : 返回變量的長度。你能夠對列表或者字符串,或者任何知道怎麼測定長度的Python 對象使用這個方法(也就是說,有 __len__() 方法的對象)。
Note:過濾器是用管道符(|)來調用的,具體能夠參見Unix管道符。
[Built-in filter reference]
[Writing custom template filters]
include 標籤
該標籤容許在(模板中)包含其它的模板的內容。 標籤的參數是所要包含的模板名稱,能夠是一個變量,也能夠是用單/雙引號硬編碼的字符串。 每當在多個模板中出現相同的代碼時,就應該考慮是否要使用{%include%} 來減小重複。
下面這兩個例子都包含了 nav.html 模板:
{% include "nav.html" %}
Note:
1. 和在 get_template() 中同樣, 對模板的文件名進行判斷時會在所調取的模板名稱以前加上來自TEMPLATE_DIRS 的模板目錄。
2.若是{%include%}標籤指定的模板沒找到,Django將會在下面兩個處理方法中選擇一個:
若是 DEBUG 設置爲 True ,你將會在 Django 錯誤信息頁面看到TemplateDoesNotExist 異常。
若是 DEBUG 設置爲 False ,該標籤不會引起錯誤信息,在標籤位置不顯示任何東西。
url的用法也很簡單,只要在urlpatterns裏使用它,附加一個name,如:
url(r'^article$','news_index' ,name="news_index"),
Templates裏 這樣使用
{%url 'name'%}
地址連接就能使用了。
Note:name是全局的,你整個urlpatterns裏只能一個惟一的name,這個道理應該好理解,就像網站的地址也是惟一性的。
views裏怎麼用以及urlpatterns的地址包含有參數的時候<a href="{%url 'news_archive' 2010 02%}">2010年02月</a>時可參考[Django url 標籤的使用]
模板能夠用繼承的方式來實現複用。在整個網站中,如何減小共用頁面區域(好比站點導航)所引發的重複和冗餘代碼?
解決該問題的傳統作法是使用 服務器端的 includes ,你能夠在 HTML 頁面中使用該指令將一個網頁嵌入到另外一箇中。 事實上, Django 經過剛纔講述的 {% include %} 支持了這種方法。 可是用 Django 解決此類問題的首選方法是使用更加優雅的策略—— 模板繼承 。本質上來講,模板繼承就是先構造一個基礎框架模板,然後在其子模板中對它所包含站點公用部分和定義塊進行重載。你能夠將其視爲服務器端 include 的逆向思惟版本。 你能夠對那些 不一樣 的代碼段進行定義,而不是 共同 代碼段。
第一步是定義 基礎模板 , 該框架以後將由 子模板 所繼承。 基礎模板:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
<title>{% block title %}{% endblock %}</title>
</head>
<body>
<h1>My helpful timestamp site</h1>
{% block content %}{% endblock %}
{% block footer %}
<hr>
<p>Thanks for visiting my site.</p>
{% endblock %}
</body>
</html>
Note:
1. 全部的 {% block %} 標籤告訴模板引擎,子模板能夠重載這些部分。每一個{%block%}標籤所要作的是告訴模板引擎,該模板下的這一塊內容將有可能被子模板覆蓋。
2.注意因爲子模板並無定義 footer 塊,模板系統將使用在父模板中定義的值。 父模板{%block%} 標籤中的內容老是被看成一條退路。
3. 繼承並不會影響到模板的上下文。 換句話說,任何處在繼承樹上的模板均可以訪問到你傳到模板中的每個模板變量。
4. 你能夠根據須要使用任意多的繼承次數。
使用繼承的一種常見方式是下面的三層法:
建立 base.html 模板,在其中定義站點的主要外觀感覺。 這些都是不常修改甚至從不修改的部分。
爲網站的每一個區域建立 base_SECTION.html 模板(例如,base_photos.html 和base_forum.html )。這些模板對base.html 進行拓展,幷包含區域特定的風格與設計。
爲每種類型的頁面建立獨立的模板,例如論壇頁面或者圖片庫。 這些模板拓展相應的區域模板。
使用模板繼承的一些訣竅:
若是在模板中使用 {%extends%} ,必須保證其爲模板中的第一個模板標記。 不然,模板繼承將不起做用。
通常來講,基礎模板中的 {%block%} 標籤越多越好。記住,子模板沒必要定義父模板中全部的代碼塊,所以你能夠用合理的缺省值對一些代碼塊進行填充,而後只對子模板所需的代碼塊進行(重)定義。 俗話說,鉤子越多越好。
若是發覺本身在多個模板之間拷貝代碼,你應該考慮將該代碼段放置到父模板的某個 {% block %} 中。
若是你須要訪問父模板中的塊的內容,使用 {{block.super}}這個標籤吧,這一個魔法變量將會表現出父模板中的內容。 若是隻想在上級代碼塊基礎上添加內容,而不是所有重載,該變量就顯得很是有用了。
不容許在同一個模板中定義多個同名的 {%block%} 。 存在這樣的限制是由於block 標籤的工做方式是雙向的。 也就是說,block 標籤不只挖了一個要填的坑,也定義了在父模板中這個坑所填充的內容。若是模板中出現了兩個相同名稱的{% block %} 標籤,父模板將無從得知要使用哪一個塊的內容。
{%extends%} 對所傳入模板名稱使用的加載方法和get_template() 相同。 也就是說,會將模板名稱被添加到TEMPLATE_DIRS 設置以後。
多數狀況下, {%extends%} 的參數應該是字符串,可是若是直到運行時方能肯定父模板名,這個參數也能夠是個變量。 這使得你可以實現一些很酷的動態功能。