1. 程式人生 > >Flask之模板之宏、繼承、包含

Flask之模板之宏、繼承、包含

實現 pan 同名 value 存在 包含 冗余 3.5 hold

3.5 宏、繼承、包含

類似於python中的函數,宏的作用就是在模板中重復利用代碼,避免代碼冗余。

Jinja2支持宏,還可以導入宏,需要在多處重復使用的模板代碼片段可以寫入單獨的文件,再包含在所有模板中,以避免重復。

定義宏

{% macro input() %}
  <input type="text"
         name="username"
         value=""
         size="30"/>
{% endmacro %}

調用宏

{{ input() }}

定義帶參數的宏

{% macro input(name,value=‘‘
,type=text,size=20) %} <input type="{{ type }}" name="{{ name }}" value="{{ value }}" size="{{ size }}"/> {% endmacro %}

調用宏,並傳遞參數

{{ input(value=name,type=password,size=40)}}

把宏單獨抽取出來,封裝成html文件,其它模板中導入使用

文件名可以自定義macro.html

{% macro function() %}

    
<input type="text" name="username" placeholde="Username"> <input type="password" name="password" placeholde="Password"> <input type="submit"> {% endmacro %}

在其它模板文件中先導入,再調用

{% import macro.html as func %}
{% func.function() %}

模板繼承:

模板繼承是為了重用模板中的公共內容。一般Web開發中,繼承主要使用在網站的頂部菜單、底部。這些內容可以定義在父模板中,子模板直接繼承,而不需要重復書寫。

{% block top %}``{% endblock %}標簽定義的內容,相當於在父模板中挖個坑,當子模板繼承父模板時,可以進行填充。

子模板使用extends指令聲明這個模板繼承自哪?父模板中定義的塊在子模板中被重新定義,在子模板中調用父模板的內容可以使用super()。

父模板:base.html

  {% block top %}
    頂部菜單
  {% endblock top %}

  {% block content %}
  {% endblock content %}

  {% block bottom %}
    底部
  {% endblock bottom %}

子模板:

  {% extends base.html %}
  {% block content %}
   需要填充的內容
  {% endblock content %}

  • 模板繼承使用時註意點:
    • 不支持多繼承。
    • 為了便於閱讀,在子模板中使用extends時,盡量寫在模板的第一行。
    • 不能在一個模板文件中定義多個相同名字的block標簽。
    • 當在頁面中使用多個block標簽時,建議給結束標簽起個名字,當多個block嵌套時,閱讀性更好。

包含(Include)

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之模板之宏、繼承、包含