Flask基礎(14)-->模板代碼的復用【宏(Macro)、繼承(Block)、包含(include)】
宏
對宏(macro)的理解:
把它看作 Jinja2 中的一個函數,它會返回一個模板或者 HTML 字符串
為了避免反復地編寫同樣的模板代碼,出現代碼冗余,可以把他們寫成函數以進行重用
需要在多處重復使用的模板代碼片段可以寫入單獨的文件,再包含在所有模板中,以避免重復
定義宏
{% macro input(name,value=‘‘,type=‘text‘) %} <input type="{{type}}" name="{{name}}" value="{{value}}" class="form-control"> {% endmacro %}
調用宏
{{ input(‘name‘ value=‘zs‘)}}
這會輸出
<input type="text" name="name" value="zs" class="form-control">
把宏單獨抽取出來,封裝成html文件,其它模板中導入使用,文件名可以自定義macro.html
{% macro function(type=‘text‘, name=‘‘, value=‘‘) %} <input type="{{type}}" name="{{name}}" value="{{value}}" class="form-control"> {% endmacro %}
在其它模板文件中先導入,再調用
{% import ‘macro.html‘ as func %}
{% func.function() %}
代碼演練
使用宏之前代碼
<form> <label>用戶名:</label><input type="text" name="username"><br/> <label>身份證號:</label><input type="text" name="idcard"><br/> <label>密碼:</label><input type="password" name="password"><br/> <label>確認密碼:</label><input type="password" name="password2"><br/> <input type="submit" value="註冊"> </form>
定義宏
{#定義宏,相當於定義一個函數,在使用的時候直接調用該宏,傳入不同的參數就可以了#} {% macro input(label="", type="text", name="", value="") %} <label>{{ label }}</label><input type="{{ type }}" name="{{ name }}" value="{{ value }}"> {% endmacro %}
使用宏
<form> {{ input("用戶名:", name="username") }}<br/> {{ input("身份證號:", name="idcard") }}<br/> {{ input("密碼:", type="password", name="password") }}<br/> {{ input("確認密碼:", type="password", name="password2") }}<br/> {{ input(type="submit", value="註冊") }} </form>
模板繼承
模板繼承是為了重用模板中的公共內容。一般Web開發中,繼承主要使用在網站的頂部菜單、底部。這些內容可以定義在父模板中,子模板直接繼承,而不需要重復書寫。
標簽定義的內容
{% 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嵌套時,閱讀性更好。
包含
Jinja2模板中,除了宏和繼承,還支持一種代碼重用的功能,叫包含(Include)。它的功能是將另一個模板整個加載到當前模板中,並直接渲染。
include的使用
{% include ‘hello.html‘ %}
包含在使用時,如果包含的模板文件不存在時,程序會拋出TemplateNotFound異常,可以加上 ignore missing
關鍵字。如果包含的模板文件不存在,會忽略這條include語句。
include 的使用加上關鍵字ignore missing
{% include ‘hello.html‘ ignore missing %}
小結
- 宏(Macro)、繼承(Block)、包含(include)均能實現代碼的復用。
- 繼承(Block)的本質是代碼替換,一般用來實現多個頁面中重復不變的區域。
- 宏(Macro)的功能類似函數,可以傳入參數,需要定義、調用。
- 包含(include)是直接將目標模板文件整個渲染出來。
Flask基礎(14)-->模板代碼的復用【宏(Macro)、繼承(Block)、包含(include)】