模板继承允许你构建一个包含你站点共同元素的基 本模板“骨架”,并定义子模板可以覆盖的 块
基本模板
这个模板,我们会把它叫做 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