4

给定一个文件中有大量 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”的预处理器。

4

1 回答 1

5

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

{% extends 'macrosdir/file.html' %}
于 2013-07-19T13:56:58.973 回答