1. 程式人生 > >Flask基礎(14)-->模板代碼的復用【宏(Macro)、繼承(Block)、包含(include)】

Flask基礎(14)-->模板代碼的復用【宏(Macro)、繼承(Block)、包含(include)】

ont uri mon 16px 重新 hello 其它 left use

對宏(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)】