[Flask][04]Jinja2模板设计文档——模板继承

版权声明

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

模板继承是 Jinja 最强大的部分。模板继承允许您构建一个基础的模板”骨架”,包含您站点所有共用元素和子模板可以重写的块的定义。

听起来很复杂,但其实很简单。用一个例子来讲解,就很容易理解了。

基础模板 (Base Template)

下述模板定义了一个简单的 HTML 文档骨架,您可能会在一个简单的两栏页面中使用它,我们把它命名为 base.html 。”子”模板的工作是使用内容来填充空白块:

在这个例子中,我们使用 {% block %} 标签定义了四个可被子模板填充的块。 (block) 标签所做的就是,告诉模板引擎子模板可以重载该模板中的那些占位符。

子模板 (Child Template)

子模板可能如下所示:

标签 {% extends %} 是关键所在。它告诉模板引擎,这个模板”扩展”了另一个模板。当模板系统处理这个模板时,会首先定位父模板。扩展标签应该作为模板的第一个标签。在它之前的内容将被正常输出到body下,而非重载相应块,故这可能会造成混乱。预知此行为的更多细节以及如何利用它,请查看 Null-Master Fallback

模板的文件名取决于模板的加载程序。例如: FileSystemLoader 允许您通过提供文件名来访问其他模板。您可以使用斜线( / )来访问子路径下的模板:

但是这个行为取决于应用嵌入 Jinja 的方式。注意:由于子模板没有定义 footer 块,将使用父模板中定义的值作为替代。

在同一个模板中,不可以定义多个同名的 {% block %} 标签。存在此限制是因为块标记同时在两边作用。这是因为一个块标签不仅提供一个用于填充的占位符,同时也定义了在父模板中占位符填充的内容。如果模板中有两个同名的 {% block %} 标签,父模板将不知道使用哪个块的内容。

然而,如果您想多次打印一个块,您可以使用一个特殊的 self 变量,通过它调用相应的块名:

超块 (Super Blocks)

我们可以通过调用 super 来渲染父块的内容。这将返回父块的结果:

命名的块结束标签 (Named Block End-Tags)

为了更好地可读性, Jinja2 允许在块结束标签后添加块名称:

但是, endblock 关键字后的名称必须与块名称匹配。

块嵌套和作用域 (Block Nesting and Scope)

为了实现更复杂的布局,块可以被嵌套。每个默认块不能访问外部作用域中的变量:

这个例子将输出空白的 <li> 条目,因为在块中 item 是不可用的。这么做的原因是因为,如果块被子模板重载了,将会出现一个未在块中定义或传递给上下文的变量。

从 Jinja 2.2 开始, 您可以通过在块声明时添加一个作用域修饰符 “scoped” 来明确指定块中的变量可用:

重载块时,不必提供 scoped 修饰符。

模板对象 (Template Objects)

2.4版本中变更

如果一个模板对象被传入到模板上下文中,您也可以从该对象扩展。假设调用代码传入了一个名为 layout_template 的布局模板到环境中,这段代码便可以工作了:

之前, layout_template 变量必须是含有布局模板文件名的字符串,以便扩展标签正常工作。

One thought on “[Flask][04]Jinja2模板设计文档——模板继承

发表评论

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