模板仅仅是文本文件。它可以生成任何基于文本的格式(HTML、XML、CSV、LaTex 等等)。 它并没有特定的扩展名, .html或 .xml都是可以的。
模板包含 变量 或 表达式 ,这两者在模板求值的时候会被替换为值。模板中 还有标签,控制模板的逻辑。模板语法的大量灵感来自于 Django 和 Python 。
下面是一个最小的模板,它阐明了一些基础。我们会在文档中后面的部分解释细节:
My Webpage {% for item in navigation %} {{ item.caption }} {% endfor %}My Webpage
{{ a_variable }}
这包含了默认的设定。应用开发者也会把语法从 {% foo %}改成 或类似的东西。
这里有两种分隔符: {% ... %}和 {{ ... }}。前者用于执行诸如 for 循环 或赋值的语句,后者把表达式的结果打印到模板上。
应用把变量传递到模板,你可能在模板中弄混。变量上面也可以有你能访问的属性或元 素。变量看起来是什么,完全取决于应用提供了什么。
你可以使用点( .)来访问变量的属性,作为替代,也可以使用所谓的“下标”语 法( [])。下面的几行效果是一样的:
{{ foo.bar }}{{ foo['bar'] }}
知晓花括号 不是变量的一部分,而是打印语句的一部分是重要的。如果你访问标签 里的不带括号的变量。
如果变量或属性不存在,会返回一个未定义值。你可以对这类值做什么取决于应用的配 置,默认的行为是它如果被打印,其求值为一个空字符串,并且你可以迭代它,但其它 操作会失败。
实现
为方便起见,Jinja2 中 foo.bar在 Python 层中做下面的事情:
检查 foo上是否有一个名为 bar的属性。 如果没有,检查 foo中是否有一个 'bar'项 。 如果没有,返回一个未定义对象。foo['bar']的方式相反,只在顺序上有细小差异:
检查在 foo中是否有一个 'bar'项。 如果没有,检查 foo上是否有一个名为 bar的属性。 如果没有,返回一个未定义对象。如果一个对象有同名的项和属性,这很重要。此外,有一个过滤 器,它只查找属性。
变量可以通过 过滤器 修改。过滤器与变量用管道符号( |)分割,并且也 可以用圆括号传递可选参数。多个过滤器可以链式调用,前一个过滤器的 输出会被作为 后一个过滤器的输入。
例如 {{ name|striptags|title }}会移除 name中的所有 HTML 标签并且改写 为标题样式的大小写格式。过滤器接受带圆括号的参数,如同函数调用。这个例子会 把一个列表用逗号连接起来: {{ list|join(', ') }}。
下面的节介绍了所有的内置过滤器。
除了过滤器,所谓的“测试”也是可用的。测试可以用于对照普通表达式测试一个变量。 要测试一个变量或表达式,你要在变量后加上一个 is以及测试的名称。例如,要得出 一个值是否定义过,你可以用 name is defined,这会根据 name是否定义返回 true 或 false 。
测试也可以接受参数。如果测试只接受一个参数,你可以省去括号来分组它们。例如, 下面的两个表达式做同样的事情:
{% if loop.index is divisibleby 3 %}{% if loop.index is divisibleby(3) %}
下面的章节介绍了所有的内置测试。
要把模板中一行的部分注释掉,默认使用 {# ... #}注释语法。这在调试或 添加给你自己或其它模板设计者的信息时是有用的:
{# note: disabled template because we no longer use this {% for user in users %} ... {% endfor %}#}
默认配置中,模板引擎不会对空白做进一步修改,所以每个空白(空格、制表符、换行符 等等)都会原封不动返回。如果应用配置了 Jinja 的 trim_blocks,模板标签后的 第一个换行符会被自动移除(像 PHP 中一样)。
此外,你也可以手动剥离模板中的空白。当你在块(比如一个 for 标签、一段注释或变 量表达式)的开始或结束放置一个减号( -),可以移除块前或块后的空白:
{% for item in seq -%} {{ item }}{%- endfor %}
这会产出中间不带空白的所有元素。如果 seq是 1到 9的数字的列表, 输出会是 123456789。
如果开启了,它们会自动去除行首的空白。
提示
标签和减号之间不能有空白。
有效的:
{%- if foo -%}...{% endif %}无效的:
{% - if foo - %}...{% endif %}
有时想要或甚至必要让 Jinja 忽略部分,不会把它作为变量或块来处理。例如,如果 使用默认语法,你想在在使用把 {{作为原始字符串使用,并且不会开始一个变量 的语法结构,你需要使用一个技巧。
最简单的方法是在变量分隔符中( {{)使用变量表达式 输出:
{{ '{{' }}
对于较大的段落,标记一个块为 raw是有意义的。例如展示 Jinja 语法的实例, 你可以在模板中用这个片段:
{% raw %} {% for item in seq %} {{ item }} {% endfor %} {% endraw %}
如果应用启用了行语句,就可以把一个行标记为一个语句。例如如果行语句前缀配置为 #,下面的两个例子是等价的:
# for item in seq {{ item }} # endfor {% for item in seq %} {{ item }} {% endfor %}
行语句前缀可以出现在一行的任意位置,只要它前面没有文本。为了语句有更好的可读 性,在块的开始(比如 for、 if、 elif等等)以冒号结尾:
# for item in seq: ...# endfor
提示
若有未闭合的圆括号、花括号或方括号,行语句可以跨越多行:
# for href, caption in [('index.html', 'Index'), ('about.html', 'About')]: {{ caption }} # endfor
从 Jinja 2.2 开始,行注释也可以使用了。例如如果配置 ##为行注释前缀, 行中所有 ##之后的内容(不包括换行符)会被忽略:
# for item in seq: {{ item }} ## this comment is ignored# endfor
Jinja 中最强大的部分就是模板继承。模板继承允许你构建一个包含你站点共同元素的基 本模板“骨架”,并定义子模板可以覆盖的 块 。
听起来复杂,实际上很简单。从例子上手是最易于理解的。
这个模板,我们会把它叫做 base.html,定义了一个简单的 HTML 骨架文档,你可 能使用一个简单的两栏页面。用内容填充空的块是子模板的工作:
{% block head %} {% block title %}{% endblock %} - My Webpage {% endblock %}{% block content %}{% endblock %}
查看更多关于Jinja2中文文档_html/css_WEB-ITnose的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did114847