Jinja2中的多级模板继承?

42 投票
8 回答
54189 浏览
提问于 2025-04-15 17:27

我平时做HTML和CSS的工作,偶尔也在做Django项目的模板设计。目前我在做一个使用Jinja2的网站,最近大约用了两周的时间。我刚刚通过阅读文档发现,Jinja2不支持多层模板继承,也就是说你在渲染的时候不能使用多个

{% extends "foo" %}

。我很确定在Django中是可以做到这一点的,这样做很强大,因为你可以指定一个基础模板,然后根据这个基础模板再指定3到4个模板,最后用这些基础模板来构建页面的主要内容。继承的意义不就是让你有更多的能力去抽象,这样你只需要处理独特的代码吗?

总之,我对该怎么做完全没有头绪。我不知道有没有什么方法可以做到,效果能和Django模板一样好。我对Django和Jinja(2)都不是特别精通,但如果需要的话我可以提供任何信息。

8 个回答

17

试试这个,这个方法对我有效,感谢@Ixm的回答。

base.html

<html xmlns="http://www.w3.org/1999/xhtml">
    <body>
      {% block content %}{% endblock %}
    </body>
</html>

content.html

{% extends "base.html" %}
{% block content %}
<table>
  <tr>
  {% include "footer.html" %}
  </tr>
</table>
{% endblock %}

footer.html

{% block footer %} <td> test</td>{% endblock %}

然后用下面的方式调用:

env = Environment(loader=FileSystemLoader(os.path.join(path, "Layouts")))
template = env.get_template('content.html')
html = template.render()
print html
43

使用jinja2实现多层模板的一个好方法是使用'include'。假设你有一个叫做base_layout.html的基础模板。

<!DOCTYPE html>
<title>Base Layout</title>
<div>
  <h1>Base</h1>
  .... // write your code here
  {% block body %}{% endblock %}
</div>

然后你想要一个叫做child_layout.html的模板,它是基于这个基础模板的。

{% include "base_layout.html" %}
  <div>
  ... // write your code here
  </div>
{% block body %}{% endblock %}

现在,你的页面只需要扩展child_layout.html,这样它就会同时包含base_layout.htmlchild_layout.html的内容。

{% extends "child_layout.html" %}
{% block body %}
  ...// write your code here
{% endblock %}
33

根据文档的说法,感觉好像不支持多层继承。

和Python不同,Jinja不支持多重继承。所以在每次渲染的时候,你只能使用一个扩展标签。

我之前不知道这是说每个模板只能有一个扩展……现在我明白了,还是在Jinja的IRC频道得到了一些帮助。

撰写回答