筆記-jinja2語法
筆記-jinja2語法
1. 基本語法
控制結構 {% %}
變量取值 {{ }}
註釋 {# #}
2. 變量
最常用的是變量,由Flask渲染模板時傳過來,比如上例中的”name”,也可以是任意一種Python基礎類型,比如字符串{{ “Hello” }},用引號括起;或者數值,列表,元祖,字典,布爾值。直接顯示基礎類型沒啥意義,一般配合其他表達式一起用
運算。包括算數運算,如{{ 2 + 3 }};比較運算,如{{ 2 > 1 }};邏輯運算,如{{ False and True }}
過濾器“|”和測試器“is”。這個在後面會介紹
函數調用,如{{ current_time() }};數組下標操作,如{{ arr[1] }}
“in”操作符,如{{ 1 in [1,2,3] }}
字符串連接符”~”,作用同Python中的”+”一樣,如{{ “Hello ” ~ name ~ “!” }}
“if”關鍵字,如{{ ‘Hi, %s’ % name if name }}。這裏的”if”不是條件控制語句。
在模板中,我們可以使用“.”獲取變量的屬性
user = { ‘username‘ : ‘shansan‘, ‘bio‘: ‘我佛了‘,}
如果user為傳入模板中的字典變量,可通過"."獲取它的鍵值。
user.username等價於user[‘username‘]
可以用set標簽在模板中定義變量
{% set navigation = [(‘/‘,‘Home‘),(‘/about‘,‘關於我‘)] %}
3. 過濾器
變量可以通過“過濾器”進行修改,過濾器可以理解為是jinja2裏面的內置函數和字符串處理函數。
常用的過濾器:
safe 渲染時值不轉義
capitialize 把值的首字母轉換成大寫,其他子母轉換為小寫
lower 把值轉換成小寫形式
upper 把值轉換成大寫形式
title 把值中每個單詞的首字母都轉換成大寫
trim 把值的首尾空格去掉
striptags 渲染之前把值中所有的HTML標簽都刪掉
join 拼接多個值為字符串
replace 替換字符串的值
round 默認對數字進行四舍五入,也可以用參數進行控制
int 把值轉換成整型
那麽如何使用這些過濾器呢? 只需要在變量後面使用管道(|)分割,多個過濾器可以鏈式調用,前一個過濾器的輸出會作為後一個過濾器的輸入。
{{ ‘abc‘ | captialize }}
# Abc
{{ ‘abc‘ | upper }}
# ABC
{{ ‘hello world‘ | title }}
# Hello World
{{ "hello world" | replace(‘world‘,‘daxin‘) | upper }}
# HELLO DAXIN
{{ 18.18 | round | int }}
# 18
4. 控制結構
if語句類:
{% if daxin.safe %}
daxin is safe.
{% elif daxin.dead %}
daxin is dead
{% else %}
daxin is okay
{% endif %}
5. jinja2的for循環
for循環用於叠代Python的數據類型,包括列表,元組和字典。在jinja2中不存在while循環。
<ul>
{% for user in users %}
<li>{{ user.username|title }}</li>
{% endfor %}
</ul>
叠代字典
<dl>
{% for key, value in my_dict.iteritems() %}
<dt>{{ key }}</dt>
<dd>{{ value}}</dd>
{% endfor %}
</dl>
當然也可以加入else語句,在循環正確執行完畢後,執行
在for循環中,jinja2還提供了一些特殊的變量,用以來獲取當前的遍歷狀態:
loop.index 當前叠代的索引(從1開始)
loop.index0 當前叠代的索引(從0開始)
loop.first 是否是第一次叠代,返回bool
loop.last 是否是最後一次叠代,返回bool
loop.length 序列中的項目數量
loop.revindex 到循環結束的次數(從1開始)
loop.revindex0 到循環結束的次數(從0開始)
6. 繼承
模板繼承允許創建一個基本(骨架)文件,其他文件從該骨架文件繼承,然後針對自己需要的地方進行修改。
jinja2的骨架文件中,利用block關鍵字表示其包涵的內容可以進行修改。
以下面的骨架文件base.html為例:
<!DOCTYPE html>
<html lang="en">
<head>
{% block head %}
<link rel="stylesheet" href="style.css"/>
<title>{% block title %}{% endblock %} - My Webpage</title>
{% endblock %}
</head>
<body>
<div id="content">{% block content %}{% endblock %}</div>
<div id="footer">
{% block footer %}
<script>This is javascript code </script>
{% endblock %}
</div>
</body>
</html>
這裏定義了四處 block,即:head,title,content,footer。
{% extend "base.html" %} # 繼承base.html文件
{% block title %} Dachenzi {% endblock %} # 定制title部分的內容
{% block head %}
{{ super() }} # 用於獲取原有的信息
<style type=‘text/css‘>
.important { color: #FFFFFF }
</style>
{% endblock %}
# 其他不修改的原封不同的繼承
PS: super()函數 表示獲取block塊中定義的原來的內容。
筆記-jinja2語法