1. 程式人生 > >Jinja2語法小記

Jinja2語法小記

jinja2模板語法小記

Jinja2模板中文文件

三種常見界定符

  1. 表示式
    {{ ... }}

用於裝載字串、變數、函式呼叫等

  1. 語句
    {% ... %}

用於裝載控制語句,比如if判斷、for迴圈等

  1. 註釋
    {{# ... #}}

用於裝載一個註釋,模板渲染的時候會被忽略掉

變數

  1. 在模板中,我們可以使用“.”獲取變數的屬性
user = {
    'username' : 'shansan',
    'bio': '我佛了',
}

如果user為傳入模板中的字典變數,則我們可通過"."獲取它的鍵值。
eg:user.username


user.username等價於user['username']

  1. 我們可以用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卻不會

模板繼承

模板繼承允許我們構建一個包含站點共同元素的基本模板"骨架",並定義子模版可以覆蓋的塊

  1. 基模板 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>
  1. 子模版 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塊追加一行