Jinja2 - 在多个文件中打破宏

时间:2013-03-13 14:40:51

标签: 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包含在内。

我尝试过很多东西,但是没有按预期工作。在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”的预处理器。

1 个答案:

答案 0 :(得分:4)

您可以使用extends从现有宏文件继承。如果在' A'你继承了B' B'然后导入' A'进入一个页面,你可以调用B的宏,就像它们是文件的一部分一样,A' A'没有页面中的额外导入。根据您的要求,它将显示为外部相同的文件。这就是它的完成方式:

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