繁体   English   中英

Jinja2模板继承

[英]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_jschild.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM