[英]Jinja2 templates inheritance
使用Jinja2,是否需要在扩展其他模板的基础模板中定义所有块? 例如,给定以下模板:
<-- ultra_base.j2 -->
<head>
</head>
<body>
{% block content %}{% endblock %}
{% block extra_js %} {% endblock %}
</body>
和
<-- child.j2 -->
{% extends ultra_base %}
{% block extra_js %}
<script src="somefile.js">
{% endblock %}
{% block page_js %} {% endblock %}
和
<-- grandchild.j2 -->
{% extends child %}
{% block content %}
<h2> Grandchild Content </h2>
{% endblock content %}
{% block page_js %}
<script src="grandchild.js"></script>
{% endblock page_js %}
page_js
块永远不会呈现。 有什么方法可以渲染而不改变ultra_base
吗?
你可以使page_js
通过将{% block page_js %} {% endblock %}
内部extra_js
块child.j2
:
<-- child.j2 -->
{% extends ultra_base %}
{% block extra_js %}
<script src="somefile.js">
{% block page_js %}
{% endblock %}
{% endblock %}
问题在于page_js
中的page_js
块位于“ child.j2
中”,它不会更改ulta_base.j2
任何块,因此Jinja2不会从中渲染任何内容。 解决方案非常简单,您甚至不需要定义一个新的extra_js
块,只需使用Jinja2的super()函数:
ultra_base.j2
保持不变:
<!-- ultra_base.j2 -->
<head>
</head>
<body>
{% block content %}{% endblock %}
{% block extra_js %} {% endblock %}
</body>
child.j2
模板:
<!-- child.j2 -->
{% extends ultra_base %}
{% block extra_js %}
{{ super() }}
<script src="somefile.js"></script>
{% endblock %}
和grandchildj2
:
<!-- grandchild.j2 -->
{% extends child %}
{% block content %}
<h2> Grandchild Content </h2>
{% endblock content %}
{% block extra_js %}
{{ super() }}
<script src="grandchild.js"></script>
{% endblock extra_js %}
Jinja2将负责包括来自父模板的块内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.