一 簡要css
簡單的來講模板繼承包含基本模板和子模板。其中基本模板裏包含了你這個網站裏的基本元素的基本骨架,可是裏面有一些空的或者是不完善的塊(block)須要用子模板來填充。html
二 基本模版樣例dom
這個模板,咱們會把它叫作 base.html ,定義了一個簡單的 HTML 骨架文檔oop
<!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 href="http://domain.invalid/">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 %}
子模板沒有定義 footer 塊,會 使用父模板中的值
能夠調用 super 來渲染父級塊的內容。這會返回父級塊的結果
四 嵌套塊和做用域網站
嵌套塊能夠勝任更復雜的佈局。而默認的塊不容許訪問塊外做用域中的變量:spa
{% for item in seq %} <li>{% block loop_item %}{{ item }}{% endblock %}</li> {% endfor %}
這個例子會輸出空的 <li> 項,由於 item 在塊中是不可用的。其緣由是,若是 塊被子模板替換,變量在其塊中多是未定義的或未被傳遞到上下文。xml
從 Jinja 2.2 開始,你能夠顯式地指定在塊中可用的變量,只需在塊聲明中添加 scoped修飾,就把塊設定到做用域中:htm
{% for item in seq %} <li>{% block loop_item scoped %}{{ item }}{% endblock %}</li> {% endfor %}
當覆蓋一個塊時,不須要提供 scoped 修飾。繼承