给定一个文件中大量的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 %}
Run Code Online (Sandbox Code Playgroud)
在其他地方,我使用导入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 %}
Run Code Online (Sandbox Code Playgroud)
{% macro B_1() %} B_1 {% endmacro %}
{% macro B_1() %} B_1 {% endmacro %}
Run Code Online (Sandbox Code Playgroud)
但是,我希望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 %}
Run Code Online (Sandbox Code Playgroud)
似乎有些奏效的唯一选择是:
{% import "A.html" as XYZ %}
{% set A_1 = XYZ.A_1 %}
Run Code Online (Sandbox Code Playgroud)
不幸的是,在这种情况下,中的宏A.html无法从主文件访问全局宏,这与将宏全部包含在中时的行为不同macros.html。
但是,无论如何无论如何都会有很多不必要的重复,因为我将为导入的每个文件有效地导入匿名模块名称,以访问并手动命名其每个宏成员。
似乎应该有一个更好的选择。
我考虑过的一种方法是编写自己的文件加载器,以加载和连接宏指令。基本上是一个从头开始创建“ macros.html”的预处理器。
您可以使用扩展继承自现有的宏文件。如果在“ A”中从“ B”继承,然后将“ A”导入到页面中,则可以调用B的宏,就好像它们是文件“ A”的一部分一样,而无需在页面中进行额外的导入。根据您的要求,它看起来将是相同的文件。这是这样做的:
{% extends 'macrosdir/file.html' %}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3188 次 |
| 最近记录: |