2015-10-20 189 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將負責包含來自父模板的塊內容。