1. 語法
在jinja2中,存在三種語法:
- 控制結構 {% %}
- 變數取值 {{ }}
jinja2模板中使用 {{ }} 語法表示一個變數,它是一種特殊的占位符,當利用jinja2進行渲染的時候,它會把這些特殊的占位符進行填充/替換,jinja2支持python中所有的Python資料型別比如串列、欄位、物件等,
- 注釋 {# #}
2. 過濾器
變數可以通過“過濾器”進行修改,過濾器可以理解為是jinja2里面的內置函式和字串處理函式,
常用的過濾器有:
1 safe: 渲染時值不轉義 2 capitialize: 把值的首字母轉換成大寫,其他子母轉換為小寫 3 lower: 把值轉換成小寫形式 4 upper: 把值轉換成大寫形式 5 title: 把值中每個單詞的首字母都轉換成大寫 6 trim: 把值的首尾空格去掉 7 striptags: 渲染之前把值中所有的HTML標簽都刪掉 8 join: 拼接多個值為字串 9 replace: 替換字串的值 10 round: 默認對數字進行四舍五入,也可以用引數進行控制 11 int: 把值轉換成整型
那么如何使用這些過濾器呢? 只需要在變數后面使用管道(|)分割,多個過濾器可以鏈式呼叫,前一個過濾器的輸出會作為后一個過濾器的輸入,
1 {{ 'abc' | captialize }} 2 # Abc 3 4 {{ 'abc' | upper }} 5 # ABC 6 7 {{ 'hello world' | title }} 8 # Hello World 9 10 {{ "hello world" | replace('world','daxin') | upper }} 11 # HELLO DAXIN 12 13 {{ 18.18 | round | int }} 14 # 18
3. for回圈
jinja2中的for回圈用于迭代Python的資料型別,包括串列,元組和字典,在jinja2中不存在while回圈,
- 迭代串列
1 <ul> 2 {% for user in users %} 3 <li>{{ user.username|title }}</li> 4 {% endfor %} 5 </ul>
- 迭代字典
1 <dl> 2 {% for key, value in my_dict.iteritems() %} 3 <dt>{{ key }}</dt> 4 <dd>{{ value}}</dd> 5 {% endfor %} 6 </dl>
4. 宏
宏類似于Python中的函式,我們在宏中定義行為,還可以進行傳遞引數,就像Python中的函式一樣一樣兒的,
在宏中定義一個宏的關鍵字是macro,后面跟其 宏的名稱和引數等
1 {% macro input(name,age=18) %} # 引數age的默認值為18 2 3 <input type='text' name="{{ name }}" value=https://www.cnblogs.com/zhangqifeng2021/p/"{{ age }}" > 4 5 {% endmacro %}
呼叫方法也和Python的類似
1 <p>{{ input('daxin') }} </p> 2 <p>{{ input('daxin',age=20) }} </p>
5. 繼承和super函式
jinja2中最強大的部分就是模板繼承,模板繼承允許我們創建一個基本(骨架)檔案,其他檔案從該骨架檔案繼承,然后針對自己需要的地方進行修改,
jinja2的骨架檔案中,利用block關鍵字表示其包涵的內容可以進行修改,
以下面的骨架檔案base.html為例:
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 {% block head %} 5 <link rel="stylesheet" href=https://www.cnblogs.com/zhangqifeng2021/p/"style.css"/> 6 <title>{% block title %}{% endblock %} - My Webpage</title> 7 {% endblock %} 8 </head> 9 <body> 10 <div id="content">{% block content %}{% endblock %}</div> 11 <div id="footer"> 12 {% block footer %} 13 <script>This is javascript code </script> 14 {% endblock %} 15 </div> 16 </body> 17 </html>
這里定義了四處 block,即:head,title,content,footer,那怎么進行繼承和變數替換呢?注意看下面的檔案
1 {% extend "base.html" %} # 繼承base.html檔案 2 3 {% block title %} Dachenzi {% endblock %} # 定制title部分的內容 4 5 {% block head %} 6 {{ super() }} # 用于獲取原有的資訊 7 <style type='text/css'> 8 .important { color: #FFFFFF } 9 </style> 10 {% endblock %} 11 12 # 其他不修改的原封不動的繼承
6. 利用jinja2進行渲染
jinja2模塊中有一個名為Enviroment的類,這個類的實體用于存盤配置和全域物件,然后從檔案系統或其他位置中加載模板,
1. 基本使用方法
大多數應用都在初始化的時候撞見一個Environment物件,并用它加載模板,Environment支持兩種加載方式:
- PackageLoader:包加載器
- FileSystemLoader:檔案系統加載器
2. PackageLoader
使用包加載器來加載檔案的最簡單的方式如下:
1 from jinja2 import PackageLoader,Environment 2 env = Environment(loader=PackageLoader('python_project','templates')) # 創建一個包加載器物件 3 4 template = env.get_template('bast.html') # 獲取一個模板檔案 5 template.render(name='daxin',age=18) # 渲染
其中:
- PackageLoader()的兩個引數為:python包的名稱,以及模板目錄名稱,
- get_template():獲取模板目錄下的某個具體檔案,
- render():接受變數,對模板進行渲染
3. FileSystemLoader
檔案系統加載器,不需要模板檔案存在某個Python包下,可以直接訪問系統中的檔案,
宣告:
文章轉載自https://www.cnblogs.com/dachenzi/p/8242713.html
- 迭代字典
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/280157.html
標籤:Python
上一篇:pandas(8):資料型別轉換
