Jinja2 - 在多个文件中拆分宏

标签 jinja2

给定一个文件中有很长数量的 Jinja2 宏,我们称之为 macros.html .

我想将该文件分解为多个较小的文件,但是当我使用 import 调用它时,它的外观是否相同.

例如,假设我有

宏.html

{% macro A_1() %} A_1 {% endmacro %}
{% macro A_2() %} A_2 {% endmacro %}
{% macro A_3() %} A_3 {% endmacro %}

{% macro B_1() %} B_1 {% endmacro %}
{% macro B_1() %} B_1 {% endmacro %}

在其他地方,我使用 import "macros.html" as macros 导入它.

我想打破 macros.html分成多个文件,例如 A.htmlB.html在这个例子中,像这样:

一个.html
{% macro A_1() %} A_1 {% endmacro %}
{% macro A_2() %} A_2 {% endmacro %}
{% macro A_3() %} A_3 {% endmacro %}

B.html
{% macro B_1() %} B_1 {% endmacro %}
{% macro B_1() %} B_1 {% endmacro %}

但是我想要使用 macros.html 的文件仍然能够将它包含在 import "macros.html" as macros 中.

我已经尝试了很多东西,但它们并没有按预期工作。我通常会收到 jinja2.environment.TemplateModule object has no attribute 'A_1' 的错误。在 macros.html 中执行以下任何操作时
{% include "A.html" %}

{# or #}

{% from "A.html" import A_1 %}

似乎有点工作的唯一选择是:
{% import "A.html" as XYZ %}
{% set A_1 = XYZ.A_1 %}

不幸的是,在这种情况下 A.html 中的宏无法从主文件访问全局宏,这与将宏全部包含在 macros.html 中时的行为不同.

无论如何,那里有很多不必要的重复,因为我会为每个导入的文件有效地导入匿名模块名称,只是为了访问和手动命名它的每个宏成员。

似乎应该有更好的选择。

我考虑过的一个是编写我自己的文件加载器来加载和连接宏的全局。基本上是一个从头开始创建“macros.html”的预处理器。

最佳答案

您可以使用扩展从现有的宏文件继承。如果在“A”中您从“B”继承,则将“A”导入页面,您可以调用 B 的宏,就好像它们是文件“A”的一部分一样,无需在页面中额外导入。正如您所要求的,它在外观上看起来是同一个文件。这是如何完成的:

{% extends 'macrosdir/file.html' %}

关于Jinja2 - 在多个文件中拆分宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15388387/

相关文章:

django - 如何从 Jinja 的扩展访问上下文变量?

python - 国际化 html 模板的性能

javascript - 如何在导入语句中使用变量

flask - 如何从 jinja 宏在 flask 上下文中设置变量?

python - jinja2 python 循环 json

javascript - 无法访问从 html javascript 上的 python render_template (jinja2/webapp2) 传递的参数

javascript - 如何检查在 Jinja2 HTML 模板中选择了一组单选按钮中的哪个单选按钮?

python - 如何在带有参数的 block 上使用 Jinja2 过滤器

python jinja2 : using variable in template with conditional

yaml - 在 Ansible 中,有没有办法将变量值强制为整数?