Jinja2中的多级模板继承?

Rey*_*Rey 24 css python django django-templates jinja2

我通过交易做html/css,我一直在和django项目一起作为模板设计师.我目前正在使用Jinja2的网站,我已经使用了大约2周.我刚刚通过阅读文档发现Jinja2不支持多级模板继承,因为你不能做多于一个

{% extends "foo" %}
Run Code Online (Sandbox Code Playgroud)

每次渲染.现在我很确定你可以在Django中做到这一点,它很强大,因为你可以指定一个基本模板,根据它指定3或4个模板,然后使用这些基础模板构建页面的内容.是不是继承点,所以你有更多的权力抽象,所以你唯一真正搞乱独特的代码?

无论如何我不知道该怎么做.我不知道是否有某些方法可以使用Django模板.我不是Django或Jinja(2)的专家,但我可以提供所需的任何信息.

Rey*_*Rey 29

文档措辞的方式,似乎它不支持继承(n)级别.

与Python不同,Jinja不支持多重继承.因此,每次渲染只能调用一个扩展标记.

我不知道这只是一个规则说1扩展每个模板....我现在知道,在jinja irc频道的帮助下.

  • 我很高兴看到你排除了这一点,我想知道同样的事情.我认为你原来的问题很清楚.处理StackOverflow上的自负可能会非常烦人 - 当你提出这个问题时,上面的人一定非常胡思乱想. (11认同)
  • 对于它的价值,我刚刚使用 jinja2 部署了多级扩展并取得了完美的成功,多亏了这篇文章,所以我有了一个 base.html,然后用 base_admin.html、base_client.html、base_form.html 等进一步扩展它,并且然后最后用实际页面扩展它们,比如accounts.html。没有更多的代码重复! (3认同)

小智 24

使用jinja2实现多级模板化的最佳方法之一是使用'include',假设您有' base_layout.html '作为基本模板

<!DOCTYPE html>
<title>Base Layout</title>
<div>
  <h1>Base</h1>
  .... // write your code here
  {% block body %}{% endblock %}
</div>
Run Code Online (Sandbox Code Playgroud)

然后你想要' child_layout.html '扩展'base_layout.

{% include "base_layout.html" %}
  <div>
  ... // write your code here
  </div>
{% block body %}{% endblock %}
Run Code Online (Sandbox Code Playgroud)

现在你的页面可以扩展' child_layout.html ',它将同时包含base_layout.htmlchild_layout.html

{% extends "child_layout.html" %}
{% block body %}
  ...// write your code here
{% endblock %}
Run Code Online (Sandbox Code Playgroud)


Dam*_*ien 12

经过很长时间的努力,我发现{{super}}jinja2模板中有多个继承级别。

以下内容的灵感来自/sf/answers/2176568131/

base.html

<html>
<body>
  {% block title %}
    Brand
  {% endblock %}
</body>
Run Code Online (Sandbox Code Playgroud)

layer-1.html

  {% extends "base.html" %}
  {% block title %}
    {{ super() }} - Section
  {% endblock %}
Run Code Online (Sandbox Code Playgroud)

layer-2.html

  {% extends "layer-1.html" %}
  {% block title %}
    {{ super() }} - Article
  {% endblock %}
Run Code Online (Sandbox Code Playgroud)

渲染模板将在 block 中layer-2.html输出。Brand - Section - Articletitle

  • 不知道为什么有人给你 -1 但这正是我正在寻找的将我的应用程序嵌入到现有仪表板布局中的方法 (2认同)

Car*_*uez 5

试试这个,感谢@Ixm的回答,这对我来说是一项工作。

base.html

<html xmlns="http://www.w3.org/1999/xhtml">
    <body>
      {% block content %}{% endblock %}
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

content.html

{% extends "base.html" %}
{% block content %}
<table>
  <tr>
  {% include "footer.html" %}
  </tr>
</table>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

footer.html

{% block footer %} <td> test</td>{% endblock %}
Run Code Online (Sandbox Code Playgroud)

然后打电话给

env = Environment(loader=FileSystemLoader(os.path.join(path, "Layouts")))
template = env.get_template('content.html')
html = template.render()
print html
Run Code Online (Sandbox Code Playgroud)

  • 即使是5年后,这个问题仍然还有很多生命!挺滑稽的。 (4认同)
  • @Rey - 让我们 11 年后实现这一目标!好一个。 (3认同)