過濾器的本質是函數(shù)。當模板內置的過濾器不能滿足需求,可以自定義過濾器。自定義過濾器有兩種實現(xiàn)方式:
創(chuàng)新互聯(lián)建站于2013年成立,先為奇臺等服務建站,奇臺等地企業(yè),進行企業(yè)商務咨詢服務。為奇臺企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務解決您的所有建站問題。
一種是通過Flask應用對象的 add_template_filter 方法
通過裝飾器來實現(xiàn)自定義過濾器
重要:自定義的過濾器名稱如果和內置的過濾器重名,會覆蓋內置的過濾器。
通過調用應用程序實例的 add_template_filter 方法實現(xiàn)自定義過濾器。該方法第一個參數(shù)是函數(shù)名,第二個參數(shù)是自定義的過濾器名稱:
def do_listreverse(li): # 通過原列表創(chuàng)建一個新列表 temp_li = list(li) # 將新列表進行返轉 temp_li.reverse() return temp_li app.add_template_filter(do_listreverse,'lireverse')
用裝飾器來實現(xiàn)自定義過濾器。裝飾器傳入的參數(shù)是自定義的過濾器名稱。
@app.template_filter('lireverse')def do_listreverse(li): # 通過原列表創(chuàng)建一個新列表 temp_li = list(li) # 將新列表進行返轉 temp_li.reverse() return temp_li
在 html 中使用該自定義過濾器
<br/> my_array 原內容:{{ my_array }}<br/> my_array 反轉:{{ my_array | lireverse }}
運行結果
my_array 原內容:[3, 4, 2, 1, 7, 9] my_array 反轉:[9, 7, 1, 2, 4, 3]
==================================================================================================
==================================================================================================
控制代碼塊主要包含兩個:
- if/else if /else / endif - for / endfor
Jinja2 語法中的if語句跟 Python 中的 if 語句相似,后面的布爾值或返回布爾值的表達式將決定代碼中的哪個流程會被執(zhí)行:
{%if user.is_logged_in() %} <a href='/logout'>Logout</a> {% else %} <a href='/login'>Login</a> {% endif %}
過濾器可以被用在 if 語句中:
{% if comments | length > 0 %} There are {{ comments | length }} comments {% else %} There are no comments {% endif %}
我們可以在 Jinja2 中使用循環(huán)來迭代任何列表或者生成器函數(shù)
{% for post in posts %} <div> <h2>{{ post.title }}</h2> <p>{{ post.text | safe }}</p> </div> {% endfor %}
循環(huán)和if語句可以組合使用,以模擬 Python 循環(huán)中的 continue 功能,下面這個循環(huán)將只會渲染post.text不為None的那些post:
{% for post in posts if post.text %} <div> <h2>{{ post.title }}</h2> <p>{{ post.text | safe }}</p> </div> {% endfor %}
在一個 for 循環(huán)塊中你可以訪問這些特殊的變量:
變量 | 描述 |
---|---|
loop.index | 當前循環(huán)迭代的次數(shù)(從 1 開始) |
loop.index0 | 當前循環(huán)迭代的次數(shù)(從 0 開始) |
loop.revindex | 到循環(huán)結束需要迭代的次數(shù)(從 1 開始) |
loop.revindex0 | 到循環(huán)結束需要迭代的次數(shù)(從 0 開始) |
loop.first | 如果是第一次迭代,為 True 。 |
loop.last | 如果是最后一次迭代,為 True 。 |
loop.length | 序列中的項目數(shù)。 |
loop.cycle | 在一串序列間期取值的輔助函數(shù)。見下面示例程序。 |
在循環(huán)內部,你可以使用一個叫做loop的特殊變量來獲得關于for循環(huán)的一些信息
比如:要是我們想知道當前被迭代的元素序號,并模擬Python中的enumerate函數(shù)做的事情,則可以使用loop變量的index屬性,例如:
{% for post in posts%} {{loop.index}}, {{post.title}} {% endfor %}
會輸出這樣的結果
1, Post title2, Second Post
cycle函數(shù)會在每次循環(huán)的時候,返回其參數(shù)中的下一個元素,可以拿上面的例子來說明:
{% for post in posts%} {{loop.cycle('odd','even')}} {{post.title}} {% endfor %}
會輸出這樣的結果:
odd Post Title even Second Post
==================================================================================================
==================================================================================================
在模板中,可能會遇到以下情況:
多個模板具有完全相同的頂部和底部內容
多個模板中具有相同的模板代碼內容,但是內容中部分值不一樣
多個模板中具有完全相同的 html 代碼塊內容
像遇到這種情況,可以使用 JinJa2 模板中的 繼承來進行實現(xiàn)
模板繼承是為了重用模板中的公共內容。一般Web開發(fā)中,繼承主要使用在網(wǎng)站的頂部菜單、底部。這些內容可以定義在父模板中,子模板直接繼承,而不需要重復書寫。
標簽定義的內容
{% block top %} {% endblock %}
相當于在父模板中挖個坑,當子模板繼承父模板時,可以進行填充。
子模板使用 extends 指令聲明這個模板繼承自哪個模板
父模板中定義的塊在子模板中被重新定義,在子模板中調用父模板的內容可以使用super()
base.html
{% block top %} 頂部菜單 {% endblock top %} {% block content %} {% endblock content %} {% block bottom %} 底部 {% endblock bottom %}
extends指令聲明這個模板繼承自哪
{% extends 'base.html' %} {% block content %} 需要填充的內容 {% endblock content %}
模板繼承使用時注意點:
不支持多繼承
為了便于閱讀,在子模板中使用extends時,盡量寫在模板的第一行。
不能在一個模板文件中定義多個相同名字的block標簽。
當在頁面中使用多個block標簽時,建議給結束標簽起個名字,當多個block嵌套時,閱讀性更好。
==================================================================================================
==================================================================================================
你可以在自己的模板中訪問一些 Flask 默認內置的函數(shù)和對象
你可以從模板中直接訪問Flask當前的config對象:
{{config.SQLALCHEMY_DATABASE_URI}} sqlite:///database.db
就是flask中代表當前請求的request對象:
{{request.url}} http://127.0.0.1
在視圖函數(shù)中設置g變量的 name 屬性的值,然后在模板中直接可以取出
{{ g.name }}
這個函數(shù)會返回之前在flask中通過flask()傳入的消息的列表,flash函數(shù)的作用很簡單,可以把由Python字符串表示的消息加入一個消息隊列中,再使用get_flashed_message()函數(shù)取出它們并消費掉:
{%for message in get_flashed_messages()%} {{message}} {%endfor%}
網(wǎng)頁題目:Flask模板操作二:高級操作之自定義過濾器,控制代碼塊和模板代碼復用,模板中特有的變量和函數(shù)
鏈接分享:http://m.rwnh.cn/article48/jcjchp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供建站公司、App設計、關鍵詞優(yōu)化、小程序開發(fā)、做網(wǎng)站、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)