Jinja2模板继承

2024-05-23 22:57:32 发布

您现在位置:Python中文网/ 问答频道 /正文

使用Jinja2,是否需要在所有其他模板扩展的基础模板中定义所有块?例如,给定以下模板:

<-- ultra_base.j2 -->
<head> 
</head>
<body>
  {% block content %}{% endblock %}
  {% block extra_js %} {% endblock %}
</body>

以及

^{pr2}$

以及

<-- 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的情况下呈现它?在


Tags: 模板jinja2basepagejsscriptbodyh2
2条回答

问题是child.j2中的page_js块是“在无处可寻的中间”,它不会改变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模板:

^{pr2}$

{cd7>和^:

<!  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将负责包含来自父模板的块内容。在

通过将{% block page_js %} {% endblock %}放在child.j2中的extra_js块内,可以呈现page_js

<  child.j2  >
{% extends ultra_base %}

{% block extra_js %}
    <script src="somefile.js"> 
    {% block page_js %} 
    {% endblock %}
{% endblock %}

相关问题 更多 >