Jinja2 -跨多个文件断开宏

  • 本文关键字:文件 断开 Jinja2 jinja2
  • 更新时间 :
  • 英文 :


考虑到一个文件中有大量的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.htmlB.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' %}

最新更新