如何在jinja2中导入模板块

时间:2018-04-08 10:09:41

标签: python templates frontend jinja2

我想使用jinja2来设计一个模板,该模板将作为文章呈现,其章节应自由组合。所以我创建了一个base.html作为骨架。问题是章节包含一些可重复使用的表格和图像元素,如果我将这些元素用作“宏”,那么很难将章节用作“宏”和“#39”。 ;太。但是,如果我使用章节作为'阻止',我该如何导入'阻止'进入骨架?并且必须将一些局部变量传递到章节中。

以下是我的脚本示例。该脚本读取config.json并将其转换为dict以传递给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 %}

我搜索并发现脚本中的模板对象似乎有&#39;块&#39;属性,所以我尝试将模板文件作为对象导入并使用&#39; .blocks&#39;获取模板对象的block属性,但它给出了如下错误:

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

我检查了jinja2的代码,发现导入的模板对象是&#39; TemplateModule&#39;课程,不同于&#39;模板&#39;脚本中的类,以及&#39; TemplateModule&#39;上课似乎没有&#39;阻止&#39;属性,甚至不导出块。

那么如何导入模板块呢?或者我应该更改我的jinja2陈述?

0 个答案:

没有答案