jinja2中的多级模板继承?
-
21-09-2019 - |
题
我按贸易做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.html 和 child_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代码中。