как импортировать блок шаблона в jinja2

avatar
willow
8 апреля 2018 в 10:09
625
0
0

Я хочу использовать jinja2 для разработки шаблона, который будет отображаться как статья, главы и разделы которой должны свободно комбинироваться. Поэтому я создаю base.html в качестве скелета. Проблема в том, что главы и разделы содержат некоторые многократно используемые элементы таблицы и изображения, и если я использую эти элементы как «макро», то будет сложно использовать главы и разделы также как «макро». Но если я использую главы и разделы как «блок», как я могу импортировать «блок» в скелет? И некоторые локальные переменные должны быть переданы в главы и разделы.

Вот пример моего скрипта. Сценарий читает config.json и превращает его в словарь для передачи в base.html для рендеринга. Фактическое количество глав и разделов намного больше, чем я представил в примере, с несколькими абзацами, а также количеством типов компонентов.

#config.json
{"templates":[
        {"title":"chapter1",
        "children":[
                {"title":"chapter1_1","template":"template1.html","block":"block1"},
                {"title":"chapter1_2","template":"template2.html","block":"block1","parameter":{"note":"hello world"}},
        ]},
        {"title":"chapter2","template":"template1.html","block":"block2","parameter":{"note":"blabla"}}
]}


#base.html
{% from "component.html" import common_table as common_table with context %}
{% from "component.html" import common_img as common_img with context %}
{%- for chapter in chapter_list %}
        {%- set ch_loop = loop %}
        <h2>{{ ch_loop.index }}&nbsp;{{ chapter.title }}</h2>
        {%- if chapter.children %}
                {%- for section in chapter.children %}
                        <h3>{{ ch_loop.index }}.{{ loop.index }}&nbsp;{{ section.title }}</h3>
                        {% import section.template as template with context %}
                        {% set parameter=section.parameter %}
                        {{ template.blocks[section.block] }}
                {%- endfor %}
        {%- else %}
                {% import chapter.template as template with context %}
                {% set parameter=chapter.parameter %}
                {{ template.blocks[chapter.block] }}
        {%- endif %}
{%- endfor %}

#template1.html 
{% block block1 %}
        I am block 1
        {{ common_table(id="table1",head="nohead")  }}
        {{ common_img(src="css/icon/icon1.png")  }}
{% endblock %}

{% block block2 %}
        I am block 2
        {{ common_img(src="css/icon/icon2.png")  }}
        {% if parameter.note=="blabla" %}
                {{ "blabla~blabla~" }}
        {% endif %}
{% endblock %}

#component.html
{% macro common_table(id, name,note, head="onehead") %}
        {% if name %}
                <b class="tablename">{{ name }}</b>
        {% endif %}
        <table id="{{ id }}" class=" {{ head }}"></table>
        {% if note %}
                 <p class="tablenote">{{ note }}</p>
        {% endif %}
{% endmacro %}

{% macro common_img(src, alt, name) %}
        <img  src="{{ src }}" alt="{{ alt }}">
        {% if name %}
                <b class="imgname">{{ name }}</b>
        {% endif %}
{% endmacro %}

Я провел поиск и обнаружил, что объект шаблона в сценарии имеет атрибут «блоки», поэтому я попытался импортировать файлы шаблонов как объект и использовать «.blocks», чтобы получить атрибут блока объекта шаблона, но это дало мне ошибка следующего вида:

jinja2.exceptions.UndefinedError: 'jinja2.environment.TemplateModule object' has no attribute 'blocks'

Я проверил код jinja2 и обнаружил, что импортированный объект шаблона является классом «TemplateModule», отличным от класса «Template» в скрипте, и класс «TemplateModule», похоже, не имеет атрибута «blocks», даже не экспортирует блоки .

Итак, как я могу импортировать блок шаблона? Или мне следует изменить свои утверждения jinja2?

Источник
Martijn Pieters
8 апреля 2018 в 10:10
0

Почему бы не попробовать сначала, а затем задать конкретные вопросы о ваших попытках?

willow
9 апреля 2018 в 02:34
0

@Martijn Pieters Я пытался использовать блок для размещения глав и разделов, но получил ошибку. Пожалуйста, посмотрите мой вопрос еще раз, я редактирую его с примером.

Ответы (0)