考虑到一个文件中有大量的Jinja2宏,我们称它为macros.html
。
我想把这个文件分解成一些更小的文件,但是当我用import
调用它时,它看起来是一样的。
例如,假设我有
macros.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
,如下所示:
A.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
中。
我已经尝试了许多事情,但他们没有像预期的那样工作。在macros.html
jinja2.environment.TemplateModule object has no attribute 'A_1'
的错误{% 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"的预处理器。
可以使用extends来继承现有的宏文件。如果在'A'你从'B'继承,然后导入'A'到一个页面,你可以调用B的宏,如果他们是文件'A'的一部分,没有额外的导入在你的页面。正如您所要求的,它将显示为相同的文件向外。这是怎么做的:
{% extends 'macrosdir/file.html' %}