[Flask][14]Jinja2模板设计文档——扩展模块、自动转义重载

版权声明

本文出自 “ 幻冥极地 ” 博客 ,作者 小貘 采用 署名-非商业性使用-相同方式共享 协议。转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。
https://www.moorehy.com/archives/295

扩展 (Extensions)

接下来的章节介绍了 Jinja2 可被应用开启的内建扩展。当然应用也可以提供本文档没有覆盖到的更多的扩展;在这种情况下,应该提供一个单独的文档,来解释所用的 扩展 (extensions)。

i18n

如果开启 i18n 扩展,可以将模板中的一部分标记为可翻译。要标记一个章节为可翻译,您可以使用 trans

要翻译模板表达式(例如:使用模板过滤器,或者只是访问对象的属性),您需要将表达式绑定到名称以在翻译块中使用:

如果您需要在一个 trans 标签中绑定多个表达式,请使用逗号分隔( , ):

在 trans 标签中除了变量标签外不允许使用任何语句。

对于复数表示,您可以在 transendtrans 之间使用 pluralize 标签指定单数和复数形式:

默认情况下,语句块中的第一个变量用于确认正确的单复数形式。如果您希望指定用于判断的变量,可以通过将用于判断的变量名作为参数添加到 pluralize 语句中,用以指定单复数形式判断依据:

在表达式中翻译一个字符串也是可行的。可通过以下三个函数实现:

  • gettext: 翻译单数形式的字符串
  • ngettext: 翻译复数形式的字符串
  • _: gettext 的别名

例如:您可以像这样轻松的打印一个翻译后的字符串:

要使用占位符,请使用 format 过滤器:

对于多个占位符,一定要使用 format 的关键字参数,因为其他语言可能不会使用相同的单词顺序。

2.5版本中变更

如果激活了新格式的 gettext 调用( Newstyle Gettext ),那么可以更容易的使用占位符:

注意,除了常规参数外, ngettext 函数的格式化字符串还会自动接收 count 作为 num 参数。

表达式语句 (Expression Statement)

如果该扩展被加载,那么可以时候用 do 标签,它很像常规的变量表达式( {{ ... }} );还不过它不打印任何输出。这可用于修改列表(list):

循环控制 (Loop Controls)

如果应用开启 循环控制 ,那么可以在循环中使用 breakcontinue 。当执行到 break 语句时,循环退出;执行到 continue 语句时,停止处理并继续下个迭代。

下述循环为跳过偶数次迭代:

同样的,可以实现一个第10次迭代后停止处理并退出的循环:

注意, loop.index 从1开始计数, loop.index0 从0开始计数(详情参阅: For )。

With语句 (With Statement)

2.3版本中引入

with 语句可以创建一个新的内部作用域。此作用域中的变量设置在该作用域外不可见。

简而言之:

因为在作用域开始设置变量很常见,所以您可以在 with 语句内设置。以下两个例子是等效的:

在这里有一个关于作用域的重要说明。在 2.9 以前的 Jinja 版本中,引用一个变量到另一个变量的行为会造成一些意外的后果。尤其是定义在 with 块起始语句中的一个变量引用另一个变量。导致这个问题的原因是清除作用域的行为,并且已经被改进了。尤其在更新的 Jinja2 版本中,以下代码总是引用 with 语句块外部的 a 变量:

在早期 Jinja 版本中, b 属性将引用第一个属性的结果。如果您依赖于这一行为,可以使用 tag 标签重写:

扩展

在旧版本的 Jinja 中(2.9以前),需要使用扩展来开启这个特性。现在已经是默认开启了。

自动转义重载 (Autoescape Overrides)

2.4版本中引入

如果您想,您可以在模板中开启/关闭自动转义。

例如:

endautoescape 标签后,将恢复为其之前的设置。

扩展

在旧版本的 Jinja 中(2.9以前),需要使用扩展来开启这个特性。现在已经是默认开启了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注