Jinja2語法小記
jinja2模板語法小記
三種常見界定符
- 表示式
{{ ... }}
用於裝載字串、變數、函式呼叫等
- 語句
{% ... %}
用於裝載控制語句,比如if判斷、for迴圈等
- 註釋
{{# ... #}}
用於裝載一個註釋,模板渲染的時候會被忽略掉
變數
- 在模板中,我們可以使用“.”獲取變數的屬性
user = {
'username' : 'shansan',
'bio': '我佛了',
}
如果user為傳入模板中的字典變數,則我們可通過"."獲取它的鍵值。
eg:user.username
user.username等價於user['username']
- 我們可以用set標籤在模板中定義變數
{% set navigation = [('/','Home'),('/about','關於我')] %}
使用endset宣告結束
過濾器(filter)
過濾器(filter)是一些可以用來修改和過濾特殊變數值的函式。
過濾器和變數用一個豎線“|”(管道符號)隔開,需要引數的過濾器可以像函式一樣使用括號傳遞
eg: 對一個movies列表使用length過濾器獲取其長度
movies|length
下面是Jinja2常用的內建過濾器
過濾器 | 說明 |
---|---|
default(value,default_value,boolean=False) | 設定預設值,預設值作為引數傳入,別名為d |
escap(s) | 轉義HTML文字,別名為e |
first(seq) | 返回序列的第一個元素 |
last(seq) | 返回列表的最後一個元素 |
length(object) | 返回變數的長度 |
safe(value) | 將變數標記為安全,避免轉義 |
wordcount(s) | 計算單詞數量 |
過濾器函式的第一個引數表示被過濾的變數值(value)或字串(s),即豎線符號左側的值,其他引數可以使用括號傳入
測試器(Test)
測試器主要用來判斷一個值是否滿足某種變數型別,返回布林值(True or False)的特殊函式
語法為:**if...is...
- is的左側是測試器函式的第一個引數(value)
- 其他引數可以通過新增括號傳入,也可以在右側使用空格連線
Jinja2常用內建測試器
測試器 | 說明 |
---|---|
callable(object) | 判斷物件是否可呼叫 |
defined(value) | 判斷變數是否已定義 |
none(value) | 判斷變數是否為None |
number(value) | 判斷變數是否為數字 |
string(value) | 判斷變數是否為字串 |
sequence(value) | 判斷變數是否為序列,比如字串、列表、元組 |
iterable(value) | 判斷變數是否可迭代 |
mapping(value) | 判斷變數是否是匹配物件,比如字典 |
smeas(value,other) | 判斷變數與other是否指向相同的記憶體地址 |
{% if foo is smeas(bar) %}
{# 等價於 #}
{% if foo is smeas bar %}
判斷foo和bar所以指向的記憶體地址是否相同
語句
在Jinja2中,語句使用
{% ... %}
標識
在語句結束的地方,必須新增結束標籤
- if語句使用endif
- for語句使用endfor
{% if user.name == 'shansan' %}
<h1>you are right!</h1>
{% else %}
<h1>you are wrong!</h1>
{% endif %}
{% for g in ga %}
<li>{{ g.name }} - {{ g.year }}</li>
{% endfor %}
不可使用break和continue控制迴圈的執行
模板
區域性模板
- 當多個獨立模板中使用到同一塊HTML程式碼時,可以把這部分程式碼抽離出來,放到區域性模板中
- 區域性模板的命名一般以一個下劃線開始
- 使用include標籤插入一個區域性模板,eg: {% include '_banner.html' %}
巨集
- 巨集,類似於Python中的函式。使用巨集可以封裝一部分模板程式碼
- 一般把巨集寄存在即存在名為macros.html或_macros.html檔案中
- 使用macro和endmacro標籤宣告巨集的開始和結束
- 在開始標籤中定義巨集的名稱和接收的引數
{% macro qux(amount=1) %}
{% if amount==1 %}
I am qux.
{% elif amount>1 %}
We are qux.
{% endif %}
{% endmacro %}
就像從Python模組中匯入函式一樣,我們可以使用import匯入巨集
{% from 'macros.html' import qux %}
PS:預設情況下,使用include匯入一個區域性模板會傳遞上下文到區域性模板中,但使用import卻不會
模板繼承
模板繼承允許我們構建一個包含站點共同元素的基本模板"骨架",並定義子模版可以覆蓋的塊
- 基模板 base.html
** 在基模板中定義的塊(block),可以讓子模版通過定義同名的塊來執行繼承操作 **
塊的開始和結束分別使用block和endblock標籤,不同的塊允許巢狀
以下示例程式碼中使用head、title、styles、content、footer和scripts劃分了不同的標籤塊
<!DOCTYPE html>
<html>
<head>
{% block head %}
<meta charset="utf-8">
<title>{% block title %}Template - HelloFlask{% endblock %}</title>
{% block styles %}{% endblock styles %}
{% endblock head %}
</head>
<body>
<ul><li><a href="{{ url_for('index') }}">Home</a></li></ul>
<main>
{% block content %}{% endblock content %}
</main>
<footer>
{% block footer %}
{% endblock footer %}
</footer>
{% block scripts %}{% endblock scripts %}
</body>
</html>
- 子模版 index.html
- 當在子模版建立同名的塊時,會使用字塊的內容覆蓋父塊的內容
- 這裡子模版的content塊的內容覆蓋了基模板content塊的內容
- extends 標籤必須是模板中的第一個 標籤
{% extends 'base.html' %}
{% from 'macros.html' import qux %}
{% block content %}
{% set name='baz' %}
<h1>Template</h1>
<ul>
<li><a href="{{ url_for('watchlist') }}">Watchlist</a></li>
<li>Filter: {{ foo|musical }}</li>
<li>Global: {{ bar() }}</li>
<li>Test: {% if name == 'baz' %}I am baz.{% endif %}</li>
<li>Macro: {{ qux(amount=5) }}</li>
</ul>
{% endblock content %}
*** 如需要向基模板中最佳內容,可以使用Jinja2的super()函式 ***
如向基模板的styles塊追加一行