给定一个文件中有很长数量的 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.html
和 B.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/