樣板繼承¶
Jinja 最強大的部分是樣板繼承。樣板繼承讓您能夠建立一個基礎的「骨架」樣板,其中包含您網站的所有通用元素,並定義子樣板可以覆寫的區塊。
聽起來很複雜,但其實非常基本。從範例開始理解它最容易。
基礎樣板¶
這個樣板,我們稱之為 layout.html
,定義了一個簡單的 HTML 骨架文件,您可能會將其用於簡單的雙欄頁面。「子」樣板的工作是用內容填滿空的區塊
<!doctype html>
<html>
<head>
{% block head %}
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
<title>{% block title %}{% endblock %} - My Webpage</title>
{% endblock %}
</head>
<body>
<div id="content">{% block content %}{% endblock %}</div>
<div id="footer">
{% block footer %}
© Copyright 2010 by <a href="http://domain.invalid/">you</a>.
{% endblock %}
</div>
</body>
</html>
在這個範例中,{% block %}
標籤定義了子樣板可以填入的四個區塊。block
標籤所做的只是告訴樣板引擎,子樣板可以覆寫樣板的這些部分。
子樣板¶
子樣板可能看起來像這樣
{% extends "layout.html" %}
{% block title %}Index{% endblock %}
{% block head %}
{{ super() }}
<style type="text/css">
.important { color: #336699; }
</style>
{% endblock %}
{% block content %}
<h1>Index</h1>
<p class="important">
Welcome on my awesome homepage.
{% endblock %}
{% extends %}
標籤是這裡的關鍵。它告訴樣板引擎這個樣板「繼承」自另一個樣板。當樣板系統評估這個樣板時,首先它會找到父樣板。extends 標籤必須是樣板中的第一個標籤。要呈現父樣板中定義的區塊內容,請使用 {{ super() }}
。