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.html и B.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" с нуля.


person Brian M. Hunt    schedule 13.03.2013    source источник
comment
Похоже, вам просто нужно решить, хранить ли их все в одном файле или импортировать два файла, но не оба. Я не думаю, что вы можете импортировать два файла с одинаковым именем, иначе возникнет конфликт.   -  person Paxwell    schedule 21.05.2013


Ответы (1)


Вы можете использовать расширения для наследования от существующих файлов макросов. Если в «A» вы наследуете «B», а затем импортируете «A» на страницу, вы можете вызывать макросы B, как если бы они были частью файла «A» без дополнительного импорта на вашей странице. Как вы и просили, внешне это будет один и тот же файл. Вот как это делается:

{% extends 'macrosdir/file.html' %}
person Nickel    schedule 19.07.2013
comment
Это не удастся, если я захочу наследовать макросы из более чем одного файла, верно? например Если бы я хотел импортировать макросы из A.html, B.html, C.html в macros.html, я не мог бы сделать {% extends 'A.html' %} {% extends 'B.html' %} {% extends 'C.html' %}, так как это выдавало бы ошибку extended multiple times - person Hrishikesh; 13.01.2021