jinja2基础

基本语法

在jinja2中,存在三种语法:

  1. 控制结构 {% %}
  2. 变量取值 {{ }}
  3. 注释 {# #}

变量

支持python中所有的数据类型

过滤器

过滤器名称        说明    
safe     渲染时值不转义
capitialize     把值的首字母转换成大写,其他子母转换为小写
lower     把值转换成小写形式 
upper     把值转换成大写形式 
title     把值中每个单词的首字母都转换成大写
trim     把值的首尾空格去掉
striptags     渲染之前把值中所有的HTML标签都删掉
join      拼接多个值为字符串
replace     替换字符串的值
round     默认对数字进行四舍五入,也可以用参数进行控制
int      把值转换成整型

使用示例

{{ 'abc' | upper  }}
# ABC
{{ 'hello world' | title  }}
# Hello World
{{ "hello world" | replace('world','daxin') | upper }}
# HELLO DAXIN
{{ 18.18 | round | int }}
# 18

 

控制结构


{% if daxin.safe %}
daxin is safe.
{% elif daxin.dead %}
daxin is dead
{% else %}
daxin is okay
{% endif %}

 

for循环

{% if daxin.safe %}
daxin is safe.
{% elif daxin.dead %}
daxin is dead
{% else %}
daxin is okay
{% endif %}

 

在宏中定义一个宏的关键字是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>

 

继承和Super函数

模板继承允许我们创建一个基本(骨架)文件,其他文件从该骨架文件继承,然后针对自己需要的地方进行修改。

jinja2的骨架文件中,利用block关键字表示其保函的内容可以进行修改

一下面的骨架文件base.html为例

<!DOCTYPE html>
<html lang="en">
<head>
    {% block head %}
    <link rel="stylesheet" href="#root/CnWid5WDIl3F"/>
    <title>{% block title %}{% endblock %} - My Webpage</title>
    {% endblock %}
</head>
<body>
<div id="content">{% block content %}{% endblock %}</div>
<div id="footer">
    {% block  footer %}
    <script>This is javascript code </script>
    {% endblock %}
</div>
</body>
</html>

这里定义了四处 block,即:head,title,content,footer。那怎么进行继承和变量替换呢?注意看下面的文件

{% extend "base.html" %}       # 继承base.html文件
{% block title %} Dachenzi {% endblock %}   # 定制title部分的内容
{% block head %}
    {{  super()  }}        # 用于获取原有的信息
    <style type='text/css'>
    .important { color: #FFFFFF }
    </style>
{% endblock %}   
# 其他不修改的原封不同的继承

 

表达式

Jinja 中到处都允许使用基本表达式。这像常规的 Python 一样工作,即使你不用 Python 工作,你也会感受到其带来的便利。

字面量

表达式最简单的形式就是字面量。字面量表示诸如字符串和数值的 Python 对象。下面 的字面量是可用的:

“Hello World”:

双引号或单引号中间的一切都是字符串。无论何时你需要在模板中使用一个字 符串(比如函数调用、过滤器或只是包含或继承一个模板的参数),它们都是 有用的。

42 / 42.23:

直接写下数值就可以创建整数和浮点数。如果有小数点,则为浮点数,否则为 整数。记住在 Python 里, 42 和 42.0 是不一样的。

[‘list’, ‘of’, ‘objects’]:

一对中括号括起来的东西是一个列表。列表用于存储和迭代序列化的数据。例如 你可以容易地在 for 循环中用列表和元组创建一个链接的列表:

<ul> {% for href, caption in [( 'index.html', 'Index'), ('about.html', 'About'),                         ('downloads.html', 'Downloads')] %}    <li><a href="{{ href }}"> {{caption }}</a></li> {% endfor %} </ul>

(‘tuple’, ‘of’, ‘values’):

元组与列表类似,只是你不能修改元组。如果元组中只有一个项,你需要以逗号 结尾它。元组通常用于表示两个或更多元素的项。更多细节见上面的例子。

{‘dict’: ‘of’, ‘key’: ‘and’, ‘value’: ‘pairs’}:

Python 中的字典是一种关联键和值的结构。键必须是唯一的,并且键必须只有一个 值。字典在模板中很少使用,罕用于诸如 xmlattr() 过滤器之类。

true / false:

true 永远是 true ,而 false 始终是 false 。

提示

特殊常量 true 、 false 和 none 实际上是小写的。因为这在过去会导致 混淆,过去 True 扩展为一个被认为是 false 的未定义的变量。所有的这三个 常量也可以被写成首字母大写( True 、 False 和 None )。尽管如此, 为了一致性(所有的 Jinja 标识符是小写的),你应该使用小写的版本。

算术

Jinja 允许你用计算值。这在模板中很少用到,但是为了完整性允许其存在。支持下面的 运算符:

+

把两个对象加到一起。通常对象是素质,但是如果两者是字符串或列表,你可以用这 种方式来衔接它们。无论如何这不是首选的连接字符串的方式!连接字符串见 ~ 运算符。 {{ 1 + 1 }} 等于 2 。

-

用第一个数减去第二个数。 {{ 3 - 2 }} 等于 1 。

/

对两个数做除法。返回值会是一个浮点数。 {{ 1 / 2 }} 等于 {{ 0.5 }} 。

//

对两个数做除法,返回整数商。 {{ 20 // 7 }} 等于 2 。

%

计算整数除法的余数。 {{ 11 % 7 }} 等于 4 。

*

用右边的数乘左边的操作数。 {{ 2 * 2 }} 会返回 4 。也可以用于重 复一个字符串多次。 {{ ‘=’ * 80 }} 会打印 80 个等号的横条。

**

取左操作数的右操作数次幂。 {{ 2**3 }} 会返回 8 。

比较

==

比较两个对象是否相等。

!=

比较两个对象是否不等。

>

如果左边大于右边,返回 true 。

>=

如果左边大于等于右边,返回 true 。

<

如果左边小于右边,返回 true 。

<=

如果左边小于等于右边,返回 true 。

逻辑

对于 if 语句,在 for 过滤或 if 表达式中,它可以用于联合多个表达式:

and

如果左操作数和右操作数同为真,返回 true 。

or

如果左操作数和右操作数有一个为真,返回 true 。

not

对一个表达式取反(见下)。

(expr)

表达式组。

提示

is 和 in 运算符同样支持使用中缀记法: foo is not bar 和 foo not in bar 而不是 not foo is bar 和 not foo in bar 。所有的 其它表达式需要前缀记法 not (foo and bar) 。

其它运算符

下面的运算符非常有用,但不适用于其它的两个分类:

in

运行序列/映射包含检查。如果左操作数包含于右操作数,返回 true 。比如 {{ 1 in [1,2,3] }} 会返回 true 。

is

运行一个 测试

|

应用一个 过滤器

~

把所有的操作数转换为字符串,并且连接它们。 {{ "Hello " ~ name ~ "!" }} 会返回(假设 name 值为 ''John' ) Hello John! 。

()

调用一个可调用量:{{ post.render() }} 。在圆括号中,你可以像在 python 中一样使用位置参数和关键字参数: {{ post.render(user, full=true) }} 。

. / []

获取一个对象的属性。(见 变量

If 表达式

同样,也可以使用内联的 if 表达式。这在某些情况很有用。例如你可以用来在一个 变量定义的情况下才继承一个模板,否则继承默认的布局模板:

{% extends layout_template if layout_template is defined else 'master.html' %}

一般的语法是 <do something> if <something is true> else <do something else> 。

else 部分是可选的。如果没有显式地提供 else 块,会求值一个未定义对象:

{{ '[%s]' % page.title if page.title }}