jinja2-模版簡介

一 簡介html

在Flask中,調用render_template來對模版進行渲染,使用render_template,只須要導入這個API就能夠,from flask import render_templateflask

 

模板僅僅是文本文件。它能夠生成任何基於文本的格式(HTML、XML、CSV、LaTex 等等)。 它並無特定的擴展名, .html 或 .xml 都是能夠的。函數

模板包含 變量 或 表達式 ,這二者在模板求值的時候會被替換爲值。模板中 還有標籤,控制模板的邏輯oop

 

二 變量測試

應用把變量傳遞到模板,你可能在模板中弄混。變量上面也能夠有你能訪問的屬性或元 素。變量看起來是什麼,徹底取決於應用提供了什麼。spa

你可使用點( . )來訪問變量的屬性,做爲替代,也可使用所謂的「下標」語 法( [])。下面的幾行效果是同樣的:xml


{{ foo.bar }} {{ foo['bar'] }}

三 條件語句ifhtm

{% if users %} <ul> {% for user in users %} <li>{{ user.username|e }}</li> {% endfor %} </ul> {% endif %}

{% if kenny.sick %} Kenny is sick. {% elif kenny.dead %} You killed Kenny! You bastard!!! {% else %} Kenny looks okay --- so far {% endif %}

四 迭代遍歷for 對象

<h1>Members</h1> <ul> {% for user in users %} <li>{{ user.username|e }}</li> {% endfor %} </ul>

模板中的變量保留它們的對象屬性,能夠迭代像 dict 的容器
<dl>
{% for key, value in my_dict.iteritems() %} <dt>{{ key|e }}</dt> <dd>{{ value|e }}</dd> {% endfor %} </dl>

在一個 for 循環塊中你能夠訪問這些特殊的變量:blog

變量 描述
loop.index 當前循環迭代的次數(從 1 開始)
loop.index0 當前循環迭代的次數(從 0 開始)
loop.revindex 到循環結束須要迭代的次數(從 1 開始)
loop.revindex0 到循環結束須要迭代的次數(從 0 開始)
loop.first 若是是第一次迭代,爲 True 。
loop.last 若是是最後一次迭代,爲 True 。
loop.length 序列中的項目數。
loop.cycle 在一串序列間期取值的輔助函數。見下面的解釋。



模板中的循環內不能 break 或 continue,(除非啓用Import name: jinja2.ext.loopcontrols,這個擴展添加了循環中的 break 和 continue 支持) 。但你能夠在迭代 中過濾序列來跳過項目。下面的例子中跳過了全部隱藏的用戶:
{% for user in users if not user.hidden %} <li>{{ user.username|e }}</li> {% endfor %}

遞歸
只須要在循環定義中加上 recursive 修飾,並在你想使用遞歸的地 方,對可迭代量調用 loop 變量
<ul class="sitemap"> {%- for item in sitemap recursive %} <li><a href="{{ item.href|e }}">{{ item.title }}</a> {%- if item.children -%} <ul class="submenu">{{ loop(item.children) }}</ul> {%- endif %}</li> {%- endfor %} </ul>

五 測試if  is

測試能夠用於對照普通表達式測試一個變量。 要測試一個變量或表達式,你要在變量後加上一個 is 以及測試的名稱。例如,要得出 一個值是否認義過,你能夠用 name is defined ,
這會根據 name 是否認義返回 true 或 false 

測試也能夠接受參數。若是測試只接受一個參數,你能夠省去括號來分組它們。例如, 下面的兩個表達式作一樣的事情:
{% if loop.index is divisibleby 3 %} {% if loop.index is divisibleby(3) %}
常見的測試函數有: callable(object)是不是一個函數, defined(value) 值是否認義,iterable(value)是否可迭代,lower(value)是否小寫,none(value)是否爲none,number(value)是不是數字

string(value)是不是字符串
{% if variable is defined %}  value of variable: {{ variable }} {% else %}  variable is not defined {% endif %}
 

六 註釋

要把模板中一行的部分註釋掉,默認使用 {# ... #} 註釋語法

 

七 空白控制

剝離模板中的空白。當你在塊(好比一個 for 標籤、一段註釋或變 量表達式)的開始或結束放置一個減號( - ),能夠移除塊前或塊後的空白

{% for item in seq -%} {{ item }} {%- endfor %}


這會產出中間不帶空白的全部元素。若是 seq 是 1 到 9 的數字的列表, 輸出會是 123456789 
標籤和減號之間不能有空白

八 轉義

最簡單的方法是在變量分隔符中( {{ )使用變量表達式輸出:

{{ '{{' }} 

對於較大的段落,標記一個塊爲 raw 是有意義的。例如展現 Jinja 語法的實例, 你能夠在模板中用這個片斷:

{% raw %} <ul> {% for item in seq %} <li>{{ item }}</li> {% endfor %} </ul> {% endraw %}

九 賦值

在代碼塊中,你也能夠爲變量賦值。在頂層的(塊、宏、循環以外)賦值是可導出的,即 能夠從別的模板中導入。

賦值使用 set 標籤,而且能夠爲多個變量賦值:

{% set navigation = [('index.html', 'Index'), ('about.html', 'About')] %} {% set key, value = call_something() %}
相關文章
相關標籤/搜索