4

ファイル内の膨大な数の 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

いずれにせよ、インポートされた各ファイルの匿名モジュール名を効果的にインポートして、各マクロメンバーにアクセスして手動で名前を付けるため、不必要な繰り返しがたくさんあります。

より良いオプションが必要なようです。

私が検討したことの 1 つは、マクロのグロブをロードして連結する独自のファイル ローダーを作成することです。基本的に「macros.html」をゼロから作成するプリプロセッサです。

4

1 に答える 1