Jinja2模板與模板繼承

Jinja2

兩個概念:

  • Jinja2:是 Python 下一個被廣泛應用的模板引擎,是由Python實現的模板語言,他的設計思想來源於 Django 的模板引擎,並擴展了其語法和一系列強大的功能,其是Flask內置的模板語言。
  • 模板語言:是一種被設計來自動生成文檔的簡單文本格式,在模板語言中,一般都會把一些變量傳給模板,替換模板的特定位置上預先定義好的佔位變量名。

渲染模版函數

  • Flask提供的 render_template 函數封裝了該模板引擎
  • render_template 函數的第一個參數是模板的文件名,後面的參數都是鍵值對,表示模板中變量對應的真實值。

使用

  • {{}} 來表示變量名,這種 {{}} 語法叫做變量代碼塊
<h1>{{ post.title }}</h1>

Jinja2 模版中的變量代碼塊可以是任意 Python 類型或者對象,只要它能夠被 Python 的 str() 方法轉換爲一個字符串就可以,比如,可以通過下面的方式顯示一個字典或者列表中的某個元素:

{{your_dict['key']}}
{{your_list[0]}}

模板變量

  • 代碼中傳入字符串,列表,字典到模板中
@app.route('/')
def index():
    # 往模板中傳入的數據
    my_str = 'Hello word'
    my_int = 10
    my_array = [3, 4, 2, 1, 7, 9]
    my_dict = {
        'name': 'xiaoming',
        'age': 18
    }
    return render_template('temp_demo1.html',
                           my_str=my_str,
                           my_int=my_int,
                           my_array=my_array,
                           my_dict=my_dict
                           )
  • 模板中代碼
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
我的模板html內容
<br/>{{ my_str }}
<br/>{{ my_int }}
<br/>{{ my_array }}
<br/>{{ my_dict }}

</body>
</html>

過濾器

過濾器的本質就是函數。有時候我們不僅僅只是需要輸出變量的值,我們還需要修改變量的顯示,甚至格式化、運算等等,而在模板中是不能直接調用 Python 中的某些方法,那麼這就用到了過濾器。

使用方式:

  • 過濾器的使用方式爲:變量名 | 過濾器。
{{variable | filter_name(*args)}}
  • 如果沒有任何參數傳給過濾器,則可以把括號省略掉
{{variable | filter_name}}

鏈式調用

在 jinja2 中,過濾器是可以支持鏈式調用的,示例如下:

{{ "hello world" | reverse | upper }}

過濾器列表操作

  • first:取第一個元素
<p>{{ [1,2,3,4,5,6] | first }}</p>
  • last:取最後一個元素
<p>{{ [1,2,3,4,5,6] | last }}</p>
  • length:獲取列表長度
<p>{{ [1,2,3,4,5,6] | length }}</p>
  • sum:列表求和
<p>{{ [1,2,3,4,5,6] | sum }}</p>
  • sort:列表排序
<p>{{ [6,2,3,1,5,4] | sort }}</p>

自定義過濾器

過濾器的本質是函數。當模板內置的過濾器不能滿足需求,可以自定義過濾器。自定義過濾器有兩種實現方式:

  • 一種是通過Flask應用對象的 add_template_filter 方法
  • 通過裝飾器來實現自定義過濾器

重要:自定義的過濾器名稱如果和內置的過濾器重名,會覆蓋內置的過濾器。

需求:添加列表反轉的過濾器

方式一

通過調用應用程序實例的 add_template_filter 方法實現自定義過濾器。該方法第一個參數是函數名,第二個參數是自定義的過濾器名稱:

def do_listreverse(li):
    # 通過原列表創建一個新列表
    temp_li = list(li)
    # 將新列表進行返轉
    temp_li.reverse()
    return temp_li

app.add_template_filter(do_listreverse,'lireverse')

方式二

用裝飾器來實現自定義過濾器。裝飾器傳入的參數是自定義的過濾器名稱。

@app.template_filter('lireverse')
def do_listreverse(li):
    # 通過原列表創建一個新列表
    temp_li = list(li)
    # 將新列表進行返轉
    temp_li.reverse()
    return temp_li

模板繼承

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

  • 繼承關鍵字
{% extends '父模板名' %}
  • 標籤定義的內容
{% block 塊變量名稱 %} {% 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嵌套時,閱讀性更好。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章