2015-10-20 87 views
1

使用Jinja2,是否需要在所有其他模板扩展的基本模板中定义所有块?例如,给出下面的模板: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的情况下渲染它?

回答

2

你可以通过将{% block page_js %} {% endblock %}extra_js块里面child.j2渲染page_js

<-- child.j2 --> 
{% extends ultra_base %} 

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

耐人寻味.... – reptilicus

+0

我认为这保留了您之后的内容顺序? – gtlambert

+0

是的,我认为是。我只是试图避免更改ultra_base模板,其实是在另一个回购。 – reptilicus

1

的问题是,在child.j2page_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模板:

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