jinja版本: jinja2.1.0
jinja2:
一.简介:
jinja2是Flask作者开发的一个模板系统,起初是仿django模板的一个模板引擎,为Flask提供模板支持。
二.语法
基本语法:
控制结构 {% %}
变量取值 {{ }}
注释 {# #}
1.变量取值 {{ }}:
jinja2模板中使用 {{ }} 语法表示一个变量,它是一种特殊的占位符。当利用jinja2进行渲染的时候,它会把这些特殊的占位符进行填充/替换,jinja2支持python中所有的Python数据类型比如列表、字段、对象等。
<p>this is a dicectory:{{ mydict['key'] }} </p>
<p>this is a list:{{ mylist[3] }} </p>
<p>this is a object:{{ myobject.something() }} </p>
2.控制结构 {% %}
2.1 if语句:
{% if daxin.safe %}
daxin is safe.
{% elif daxin.dead %}
daxin is dead
{% else %}
daxin is okay
{% endif %}
2.2 for循环:
jinja2中的for循环用于迭代Python的数据类型,包括列表,元组和字典。在jinja2中不存在while循环。
迭代列表:
<ul>
{% for user in users %}
<li>{{ user.username|title }}</li>
{% endfor %}
</ul>
迭代字典:
<dl>
{% for key, value in my_dict.iteritems() %}
<dt>{{ key }}</dt>
<dd>{{ value}}</dd>
{% endfor %}
</dl>
3. 模板集成 :extend和super()关键字
模板继承允许我们创建一个基本(骨架)文件,其他文件从该骨架文件继承,然后针对自己需要的地方进行修改。
3.1 extend : 继承骨架文件
3.2 block : 指定可以进行修改的区域
3.3 super() : 声明了super() 变量的block可以继承父级文件对应block的内容
'base.html'
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
{% block content %}
<div>this is content</div>
{% endblock %}
{% block foot %}
<div>this is foot</div>
{% endblock %}
</body>
</html>
'test.html'
{# 继承base.html文件 #}
{% extends 'base.html' %}
{# 使用 super() 关键字继承‘base.html’中对应block的内容#}
{% block content %}
{{ super()}}
<div>this is content extend</div>
{% endblock %}
{# 未使用super() 关键字,不继承‘base.html’中对应block的内容#}
{% block foot %}
<div>this is foot extend</div>
{% endblock %}
output:
this is content
this is content extend
this is foot extend
4.with关键字
限制变量的有效范围为{% with param %}与{% endwith %}之间
{% block foot %}
{% with message=get_flashed_messages() %}
{{ message }}
{% endwith %}
{% endblock %}
5.过滤器:
过滤器可以理解为是jinja2里面的内置函数和字符串处理函数。
过滤器名称 | 说明 |
default | 检查变量是否存在 |
length | 渲染时值不转义 |
lower | 值转换成小写形式 |
upper | 值转换成大写形式 |
title | 字符串中每个word首字母都转换成大写 'Szc Sss' |
capitalize | 字符串首字母都转换成大写 'Sss sss' |
trim | 去掉值的首尾空格 |
join | 拼接多个字符串 |
replace | 字符串替换 |
round | 默认对数字进行四舍五入,也可以用参数进行控制 |
int | 把值转换成整型 |
略 | .... |
过滤器使用: 只需要在变量后面使用管道(|)分割,多个过滤器可以链式调用,前一个过滤器的输出会作为后一个过滤器的输入。
{{ 'abc' | upper }}
# ABC
{{ 'hello world' | title }}
# Hello World
{{ "hello world" | replace('world','daxin') | upper }}
# HELLO DAXIN
{{ 18.18 | round | int }}
6.宏 :
宏类似于Python中的函数,我们在宏中定义行为,还可以进行传递参数。
使用macro关键字定义一个宏,后面跟其宏的名称和参数
定义宏:
{% macro input(name,age=18) %} # 参数age的默认值为18
<input type='text' name="{{ name }}" value="{{ age }}" >
{% endmacro %}
引用宏
<p>{{ input('daxin') }} </p>
<p>{{ input('daxin',age=20) }} </p>