鉴于文件中有大量的Jinja2宏,我们称之为macros.html
。
我想将该文件分解为许多较小的文件,但当我使用import
调用它时,它看起来是相同的。
例如,假设我有
{% 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
,如下所示:
{% 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 %}
但是,我希望使用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”的预处理器。
答案 0 :(得分:4)
您可以使用extends从现有宏文件继承。如果在' A'你继承了B' B'然后导入' A'进入一个页面,你可以调用B的宏,就像它们是文件的一部分一样,A' A'没有页面中的额外导入。根据您的要求,它将显示为外部相同的文件。这就是它的完成方式:
{% extends 'macrosdir/file.html' %}