W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
Jinja 中最強大的部分就是模板繼承。模板繼承允許你構建一個包含你站點共同元素的基 本模板“骨架”,并定義子模板可以覆蓋的?塊?。
聽起來復雜,實際上很簡單。從例子上手是最易于理解的。
這個模板,我們會把它叫做?base.html?,定義了一個簡單的 HTML 骨架文檔,你可 能使用一個簡單的兩欄頁面。用內(nèi)容填充空的塊是子模板的工作:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
{% block head %}
<link rel="stylesheet" href="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 2008 by <a rel="external nofollow" target="_blank" >you</a>.
{% endblock %}
</div>
</body>
在本例中,?{%?block?%}?標簽定義了四個字幕版可以填充的塊。所有的?block?標簽 告訴模板引擎子模板可以覆蓋模板中的這些部分。
一個子模板看起來是這樣:
{% extends "base.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.
</p>
{% endblock %}
{%?extend?%}?標簽是這里的關鍵。它告訴模板引擎這個模板“繼承”另一個模板。 當模板系統(tǒng)對這個模板求值時,首先定位父模板。 extends 標簽應該是模板中的第一個 標簽。它前面的所有東西都會按照普通情況打印出來,而且可能會導致一些困惑。更多 該行為的細節(jié)以及如何利用它,見?Null-Master 退回?。
模板的文件名依賴于模板加載器。例如?FileSystemLoader?允許你用文件名訪 問其它模板。你可以使用斜線訪問子目錄中的模板:
{% extends "layout/default.html" %}
這種行為也可能依賴于應用內(nèi)嵌的 Jinja 。注意子模板沒有定義?footer?塊,會 使用父模板中的值。
你不能在同一個模板中定義多個同名的?{%?block?%}?標簽。因為塊標簽以兩種 方向工作,所以存在這種限制。即一個塊標簽不僅提供一個可以填充的部分,也在父級 定義填充的內(nèi)容。如果同一個模板中有兩個同名的?{%?blok?%}?標簽,父模板 無法獲知要使用哪一個塊的內(nèi)容。
如果你想要多次打印一個塊,無論如何你可以使用特殊的?self?變量并調(diào)用與塊同名 的函數(shù):
<title>{% block title %}{% endblock %}</title>
<h1>{{ self.title() }}</h1>
{% block body %}{% endblock %}
可以調(diào)用?super?來渲染父級塊的內(nèi)容。這會返回父級塊的結果:
{% block sidebar %}
<h3>Table Of Contents</h3>
...
{{ super() }}
{% endblock %}
Jinja2 允許你在塊的結束標簽中加入的名稱來改善可讀性:
{% block sidebar %}
{% block inner_sidebar %}
...
{% endblock inner_sidebar %}
{% endblock sidebar %}
無論如何,?endblock?后面的名稱一定與塊名匹配。
嵌套塊可以勝任更復雜的布局。而默認的塊不允許訪問塊外作用域中的變量:
{% for item in seq %}
<li>{% block loop_item %}{{ item }}{% endblock %}</li>
{% endfor %}
這個例子會輸出空的??項,因為?item?在塊中是不可用的。其原因是,如果 塊被子模板替換,變量在其塊中可能是未定義的或未被傳遞到上下文。
從 Jinja 2.2 開始,你可以顯式地指定在塊中可用的變量,只需在塊聲明中添加?scoped?修飾,就把塊設定到作用域中:
{% for item in seq %}
<li>{% block loop_item scoped %}{{ item }}{% endblock %}</li>
{% endfor %}
當覆蓋一個塊時,不需要提供?scoped?修飾。
Changed in version 2.4.
當一個模板對象被傳遞到模板上下文,你也可以從那個對象繼承。假設調(diào)用 代碼傳遞layout_template?布局模板到環(huán)境,這段代碼會工作:
{% extends layout_template %}
之前?layout_template?變量一定是布局模板文件名的字符串才能工作。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: