Jinja2模板中文文档
用于装载字符串、变量、函数调用等
用于装载控制语句,比如if判断、for循环等
用于装载一个注释,模板渲染的时候会被忽略掉
user = {
'username' : 'shansan',
'bio': '我佛了',
}
如果user为传入模板中的字典变量,则我们可通过"."获取它的键值。
eg:user.username
user.username等价于user[‘username’]
{% set navigation = [('/','Home'),('/about','关于我')] %}
使用endset声明结束
过滤器(filter)是一些可以用来修改和过滤特殊变量值的函数。
过滤器和变量用一个竖线“|”(管道符号)隔开,需要参数的过滤器可以像函数一样使用括号传递
eg: 对一个movies列表使用length过滤器获取其长度
movies|length
下面是Jinja2常用的内置过滤器
过滤器 | 说明 |
---|---|
default(value,default_value,boolean=False) | 设置默认值,默认值作为参数传入,别名为d |
escap(s) | 转义HTML文本,别名为e |
first(seq) | 返回序列的第一个元素 |
last(seq) | 返回列表的最后一个元素 |
length(object) | 返回变量的长度 |
safe(value) | 将变量标记为安全,避免转义 |
wordcount(s) | 计算单词数量 |
过滤器函数的第一个参数表示被过滤的变量值(value)或字符串(s),即竖线符号左侧的值,其他参数可以使用括号传入
测试器主要用来判断一个值是否满足某种变量类型,返回布尔值(True or False)的特殊函数
语法为:**if…is…
Jinja2常用内置测试器
测试器 | 说明 |
---|---|
callable(object) | 判断对象是否可调用 |
defined(value) | 判断变量是否已定义 |
none(value) | 判断变量是否为None |
number(value) | 判断变量是否为数字 |
string(value) | 判断变量是否为字符串 |
sequence(value) | 判断变量是否为序列,比如字符串、列表、元组 |
iterable(value) | 判断变量是否可迭代 |
mapping(value) | 判断变量是否是匹配对象,比如字典 |
smeas(value,other) | 判断变量与other是否指向相同的内存地址 |
{% if foo is smeas(bar) %}
{# 等价于 #}
{% if foo is smeas bar %}
判断foo和bar所以指向的内存地址是否相同
在Jinja2中,语句使用
{% ... %}
标识
在语句结束的地方,必须添加结束标签
{% if user.name == 'shansan' %}
you are right!
{% else %}
you are wrong!
{% endif %}
{% for g in ga %}
{{ g.name }} - {{ g.year }}
{% endfor %}
不可使用break和continue控制循环的执行
{% macro qux(amount=1) %}
{% if amount==1 %}
I am qux.
{% elif amount>1 %}
We are qux.
{% endif %}
{% endmacro %}
就像从Python模块中导入函数一样,我们可以使用import导入宏
{% from ‘macros.html’ import qux %}
PS:默认情况下,使用include导入一个局部模板会传递上下文到局部模板中,但使用import却不会
模板继承允许我们构建一个包含站点共同元素的基本模板"骨架",并定义子模版可以覆盖的块
** 在基模板中定义的块(block),可以让子模版通过定义同名的块来执行继承操作 **
块的开始和结束分别使用block和endblock标签,不同的块允许嵌套
以下示例代码中使用head、title、styles、content、footer和scripts划分了不同的标签块
<html>
<head>
{% block head %}
<meta charset="utf-8">
<title>{% block title %}Template - HelloFlask{% endblock %}title>
{% block styles %}{% endblock styles %}
{% endblock head %}
head>
<body>
<ul><li><a href="{{ url_for('index') }}">Homea>li>ul>
<main>
{% block content %}{% endblock content %}
main>
<footer>
{% block footer %}
{% endblock footer %}
footer>
{% block scripts %}{% endblock scripts %}
body>
html>
{% extends 'base.html' %}
{% from 'macros.html' import qux %}
{% block content %}
{% set name='baz' %}
<h1>Templateh1>
<ul>
<li><a href="{{ url_for('watchlist') }}">Watchlista>li>
<li>Filter: {{ foo|musical }}li>
<li>Global: {{ bar() }}li>
<li>Test: {% if name == 'baz' %}I am baz.{% endif %}li>
<li>Macro: {{ qux(amount=5) }}li>
ul>
{% endblock content %}
*** 如需要向基模板中最佳内容,可以使用Jinja2的super()函数 ***
如向基模板的styles块追加一行样式
{% block styles %}
{{ super() }}
{% endblock %}
参考:
https://book.douban.com/subject/30310340/
https://www.cnblogs.com/yanzi-meng/p/8342798.html
http://docs.jinkan.org/docs/jinja2/templates.html#id21