我想使用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 }} {{ chapter.title }}</h2>
{%- if chapter.children %}
{%- for section in chapter.children %}
<h3>{{ ch_loop.index }}.{{ loop.index }} {{ 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陈述?