我按贸易做HTML/CSS,并且一直在Django项目中作为模板设计师进行工作。我目前在使用Jinja2的网站上工作,我已经使用了大约2周。我刚刚通过阅读文档发现Jinja2不支持多个级别的模板继承,因为您不能做一个以上

{% extends "foo" %}

每个渲染。现在,我很确定您可以在Django中执行此操作,这很强大,因为您可以指定基本模板,根据该模板指定3或4个模板,然后使用这些基本模板来构建页面的肉。不是继承的意义,因此您有更多的动力来抽象,因此您唯一真正弄乱了唯一的代码?

无论如何,我都不知道这里该怎么办。我不知道是否有某种方法可以与Django模板一样可行。我并不是Django或Jinja(2)的专家,但我可以提供所需的任何信息。

有帮助吗?

解决方案

文档措辞的方式,似乎不支持继承(n)深度。

与Python Jinja不同,Jinja不支持多重继承。因此,您只能拥有一个名为每个渲染的扩展标签。

我不知道这只是一个规则,说每个模板的扩展1。我现在知道,在Jinja IRC频道的一些帮助下。

其他提示

使用jinja2实现多级模板的最佳方法之一是使用“ inclage“让你说你有”base_layout.html'作为基本模板

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

然后你想拥有child_layout.html“扩展” base_layout。

{% 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 %}

尝试一下,这是我的工作,感谢@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

我最近遇到了同样的问题。我想继承几个儿童模板,并且奏效。为了说明它,我想向您展示一个对我有用的解决方案:

我有一个base.html文件,该文件具有块内容,并由manage.html扩展。并且该manage.html具有一个由Internet_market.html扩展的块sub_manage,因此在视觉上看起来像:

|- base.html (block content)
|--manage.html (extends base.html)
|---sub_manage.html (extends manage.html)

当我渲染它时,EveryThink工作正常,这意味着您可以在一个渲染中获得几个{%扩展%}。唯一的事情是,如果您使用的是指向CSS或JS文件的相对链接,那么它可能无法正常工作,而是呈现的,但不会找到您的CSS/JS文件。喜欢:

<head>  
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="../static/css/bootstrap.min.css">
<script type="text/javascript" src="../static/js/bootstrap.min.js"></script>
<style type="text/css">
</head>

在这种情况下,您必须使用url_for使用动态链接。喜欢:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="{{url_for("static", filename = "css/bootstrap.min.css")}}">
<script type="text/javascript" src="{{url_for("static", filename = "js/bootstrap.min.js")}}"></script>
<style type="text/css">

请参阅文档 扩展, 包含, , 和 输入.

这提供了从多个文件中获取功能的方法,并且与嵌套深度不同。您可以完美拥有一个模板,该模板扩展了一个扩展模板的模板...

您可以使用以下方式将不同的内容组合到单个布局中。html用于各种布局设计:

{% if instance == 'type1' %}

{% elif instance == 'type2' %}

{% else %}

{% endif %}

...并致电:

render_template('layout', instance='%s' % instance)

在Python代码中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top