1. 程式人生 > >JINJA模板繼承 block

JINJA模板繼承 block

Flask中的模板可以繼承,通過繼承可以把模板中許多重複出現的元素抽取出來,放在父模板中,並且父模板通過定義block給子模板開一個口,子模板根據需要,再實現這個block,假設現在有一個base.html這個父模板,程式碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="base.css" />
    <title>{% block title %}{% endblock %}</title>
    {% block head %}{% endblock %}
</head>
<body>
    <div id="body">{% block body %}{% endblock %}</div>
    <div id="footer">
        {% block footer %}
        &copy; Copyright 2008 by <a href="http://domain.invalid/">you</a>
        {% endblock %}
    </div>
</body>
</html>

以上父模板中,抽取了所有模板都需要用到的元素htmlbody等,並且對於一些所有模板都要用到的樣式檔案style.css也進行了抽取,同時對於一些子模板需要重寫的地方,比如titleheadbody都定義成了block,然後子模板可以根據自己的需要,再具體的實現。以下再來看子模板的程式碼:

{% extends "base.html" %}
{% block title %}首頁{% endblock %}
{% block head %}
    {{ super() }}
    <style type="text/css">
        .detail{
            color: red;
        }
    </style>
{% endblock %}
{% block content %}
    <h1>這裡是首頁</h1>
    <p class="detail">
      首頁的內容
    </p>
{% endblock %}

首先第一行就定義了子模板繼承的父模板,並且可以看到子模板實現了title這個block,並填充了自己的內容,再看head這個block,裡面呼叫了super()這個函式,這個函式的目的是執行父模板中的程式碼,把父模板中的內容新增到子模板中,如果沒有這一句,則父模板中處在head這個block中的程式碼將會被子模板中的程式碼給覆蓋掉。

另外,模板中不能出現重名的block,如果一個地方需要用到另外一個block中的內容,可以使用self.blockname的方式進行引用,比如以下示例:

<title>
    {% block title %}
        這是標題
    {% endblock %}
</title>
<h1>{{ self.title() }}</h1>

以上示例中h1標籤重用了title這個block中的內容,子模板實現了title這個blockh1標籤也能擁有這個值。

另外,在子模板中,所有的文字標籤和程式碼都要新增到從父模板中繼承的block中。否則,這些文字和標籤將不會被渲染。

附:轉載黃勇老師知了課堂的flask進階筆記