模板繼承允許你構建一個包含你站點共同元素的基 本模板“骨架”,并定義子模板可以覆蓋的 塊
基本模板
這個模板,我們會把它叫做 base.html ,定義了一個簡單的 HTML 骨架文檔,你可 能使用一個簡單的兩欄頁面。用內容填充空的塊是子模板的工作:
~~~
<!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 %}
~~~
{% extend %} 標簽是這里的關鍵。它告訴模板引擎這個模板“繼承”另一個模板。 當模板系統對這個模板求值時,首先定位父模板。 extends 標簽應該是模板中的第一個 標簽。
Super 塊
可以調用 super 來渲染父級塊的內容。這會返回父級塊的結果:
~~~
{% block sidebar %}
<h3>Table Of Contents</h3>
...
{{ super() }}
{% endblock %}
~~~
HTML 轉義
當從模板生成 HTML 時,始終有這樣的風險:變量包含影響已生成 HTML 的字符。
如果啟用了手動轉義,按需轉義變量就是 你的 責任。要轉義什么?如果你有 一個 可能 包含 > 、 < 、 & 或 " 字符的變量,你必須轉義 它,除非變量中的 HTML 有可信的良好格式。轉義通過用管道傳遞到過濾器 |safe 來實現: {{ user.username|safe }} 。
For
遍歷序列中的每項。例如,要顯示一個由 users 變量提供的用戶列表:
~~~
<h1>Members</h1>
<ul>
{% for user in users %}
<li>{{ user.username|e }}</li>
{% endfor %}
</ul>
~~~
因為模板中的變量保留它們的對象屬性,可以迭代像 dict 的容器:
~~~
<dl>
{% for key, value in my_dict.iteritems() %}
<dt>{{ key|e }}</dt>
<dd>{{ value|e }}</dd>
{% endfor %}
</dl>
~~~
在一個 for 循環塊中可以訪問這些特殊的變量:
| 變量 | 描述 |
| --- | --- |
| loop.index | 當前循環迭代的次數(從 1 開始) |
| loop.index0 | 當前循環迭代的次數(從 0 開始) |
| loop.revindex | 到循環結束需要迭代的次數(從 1 開始) |
| loop.revindex0 | 到循環結束需要迭代的次數(從 0 開始) |
| loop.first | 如果是第一次迭代,為 True 。 |
| loop.last | 如果是最后一次迭代,為 True 。 |
| loop.length | 序列中的項目數。 |
如果因序列是空或者過濾移除了序列中的所有項目而沒有執行循環,你可以使用 else 渲染一個用于替換的塊:
~~~
<ul>
{% for user in users %}
<li>{{ user.username|e }}</li>
{% else %}
<li><em>no users found</em></li>
{% endfor %}
</ul>
~~~
自定義過濾器
~~~
app = Flask(__name__)
def datetimeformat(value, format="%Y-%m-%d"):
return value.strftime(format)
app.jinja_env.filters['dateformat'] = datetimeformat
~~~
~~~
可以在模板中直接調用
{{ dateformat() }}
~~~
當幾個模板中有公共部分時可以把公共部分代碼拿出來單獨放入一個html文件,
在需要使用的地方使用以下語法引入
~~~
{% include 'public_file.html' %}
~~~
jinja2完整文檔:http://docs.jinkan.org/docs/jinja2/templates.html