表达式

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

字面量

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

  • “Hello World”:
  • 双引号或单引号中间的一切都是字符串。无论何时你需要在模板中使用一个字符串(比如函数调用、过滤器或只是包含或继承一个模板的参数),它们都是有用的。
  • 42 / 42.23:
  • 直接写下数值就可以创建整数和浮点数。如果有小数点,则为浮点数,否则为整数。记住在 Python 里, 42 和 42.0 是不一样的。
  • [‘list’, ‘of’, ‘objects’]:
  • 一对中括号括起来的东西是一个列表。列表用于存储和迭代序列化的数据。例如你可以容易地在 for 循环中用列表和元组创建一个链接的列表:
  1. <ul>
  2. {% for href, caption in [('index.html', 'Index'), ('about.html', 'About'),
  3. ('downloads.html', 'Downloads')] %}
  4. <li><a href="{{ href }}">{{ caption }}</a></li>
  5. {% endfor %}
  6. </ul>
  • (‘tuple’, ‘of’, ‘values’):
  • 元组与列表类似,只是你不能修改元组。如果元组中只有一个项,你需要以逗号结尾它。元组通常用于表示两个或更多元素的项。更多细节见上面的例子。
  • {‘dict’: ‘of’, ‘key’: ‘and’, ‘value’: ‘pairs’}:
  • Python 中的字典是一种关联键和值的结构。键必须是唯一的,并且键必须只有一个值。字典在模板中很少使用,罕用于诸如 xmlattr() 过滤器之类。
  • true / false:
  • true 永远是 true ,而 false 始终是 false 。

提示

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

算术

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

  • +
  • 把两个对象加到一起。通常对象是素质,但是如果两者是字符串或列表,你可以用这种方式来衔接它们。无论如何这不是首选的连接字符串的方式!连接字符串见 ~运算符。 {{1+1}} 等于 2 。
  • -
  • 用第一个数减去第二个数。 {{3-2}} 等于 1 。
  • /
  • 对两个数做除法。返回值会是一个浮点数。{{1/2}} 等于 {{0.5}} 。
  • //
  • 对两个数做除法,返回整数商。{{20//7}} 等于 2 。
  • %
  • 计算整数除法的余数。 {{11%7}} 等于 4 。
  • *
  • 用右边的数乘左边的操作数。 {{22}} 会返回 4 。也可以用于重复一个字符串多次。 {{‘=’80}} 会打印 80 个等号的横条。

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

比较

  • ==
  • 比较两个对象是否相等。
  • !=
  • 比较两个对象是否不等。
  • >
  • 如果左边大于右边,返回 true
  • >=
  • 如果左边大于等于右边,返回 true
  • <
  • 如果左边小于右边,返回 true
  • <=
  • 如果左边小于等于右边,返回 true

逻辑

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

  • and
  • 如果左操作数和右操作数同为真,返回 true 。
  • or
  • 如果左操作数和右操作数有一个为真,返回 true 。
  • not
  • 对一个表达式取反(见下)。
  • (expr)
  • 表达式组。

提示

isin 运算符同样支持使用中缀记法: fooisnotbarfoonotinbar 而不是 notfooisbarnotfooinbar 。所有的其它表达式需要前缀记法 not(fooandbar)

其它运算符

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

  • in
  • 运行序列/映射包含检查。如果左操作数包含于右操作数,返回 true 。比如{{1in[1,2,3]}} 会返回 true 。
  • is
  • 运行一个 测试
  • |
  • 应用一个 过滤器
  • ~
  • 把所有的操作数转换为字符串,并且连接它们。{{"Hello"~name~"!"}} 会返回(假设 name 值为''John' ) HelloJohn! 。
  • ()
  • 调用一个可调用量:{{post.render()}} 。在圆括号中,你可以像在 python中一样使用位置参数和关键字参数:{{post.render(user,full=true)}} 。
  • . / []
  • 获取一个对象的属性。(见 变量

If 表达式

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

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

一般的语法是 <dosomething>if<somethingistrue>else<dosomethingelse>

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

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