樣板繼承

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 %}
      &copy; 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() }}