2012-01-27 34 views
10

我有以下:从延伸模板覆写一个`include`d模板内的块

base.html文件

<html> 
    {% include 'header.html' %} 
    <div> 
    {% block content %}Default Content{% endblock %} 
    </div> 
</html> 

了header.html

<header> 
    {% block logo %}Logo 1{% endblock %} 
</header> 

homepage.html

{% extend 'base.html' %} 
{% block logo %}Logo 2{% endblock %} 
{% block content %}Yap Yap Yap{% endblock %} 

本质上,这是行不通的。当我渲染homepage.html我得到:

<html> 
    <header>Logo 1</header> 
    <div>Yap Yap Yap</div> 
</html> 

,但如果我在header.html移动代码到base.html(即摆脱include完全的),它工作正常。任何人都可以解释为什么这是事实吗?

我有一种感觉,它与included模板在他们的父母被渲染后得到渲染有关吗?

回答

9

from the docs

的包括标签应被视为实现“使这个子模板,并包括HTML”,而不是“分析此子模板,包括它的内容就好像它是母公司的一部分。” 。这意味着所包含模板之间不存在共享状态 - 每个包含都是完全独立的呈现过程。

这样子模板(header.html)是得到充分渲染和插入父模板(base.html),意思是有没有为孩子模板(homepage.html)块的概念覆盖

0

您不能覆盖homepage.html的徽标,因为它没有在基本模板本身中定义。

的解决方案是,当你提出,到了header.html代码转移到base.html文件

5

这是我们希望一个已知的限制在不久的将来得到解决。

顺便说一下,假设你有一个更复杂的问题,你已经提到过,另一个解决方法是使标题成为一个块,而不是用新的自定义包含覆盖此块。

base.html文件

<html> 
    {% block header %} 
     {% include 'header.html' %} 
    {% endblock %} 
    <div> 
     {% block content %}Default Content{% endblock %} 
    </div> 
</html> 

了header.html

<header> 
    {% block logo %}Logo 1{% endblock %} 
</header> 

主页。HTML

{% extends 'base.html' %} 

{% block header %} 
    {% include 'homepage_header.html' %} 
{% endblock %} 

{% block content %}Yap Yap Yap{% endblock %} 

homepage_header.html

{% extends 'header.html' %} 

{% block logo %}Logo 2{% endblock %} 
1

我也有类似的问题。我有一个过滤表模板是形式

{% extends 'base.html' %} 
{% include 'filtered_table.html' %} 

其中filtered_table.html是:

{% load render_table from django_tables2 %} 
<div class="panel-body" > 
    <form method='GET'> 
    <div class="search-form" style="border: 1px solid #000000; background-color:#a3ffaf; overflow: auto;"> 
{% block render_form %} 
    {% for field in filter.form %} 
     {{ field.errors }} 
     {{ field.label_tag }} {{ field }} 
    {% endfor %} 
{% endblock %} 
    <input type='submit' value='Filter' /> 
    | 
    Displaying {{ filter.qs.count }} of {{ filter.queryset.count }} {{ object_name }}s. 
    | 
    <a href='{{ request.path }}' >Clear</a> <p> 
    </div> 

{% if table %} 
    {% render_table table %} 
{% endif %} 

</form> 

</div> 

我可能要专门手工工艺的形式,例如,通过每个场拼写出这样:

{% block render_form %} 
{{ filter.form.field1.errors }} 
{{ filter.form.field1.label_tag }} 
{{ filter.form.field1 }} 
<p> 

{{ filter.form.field2.errors }} 
{{ filter.form.field2.label_tag }} 
{{ filter.form.field2 }} 
{% endblock %} 

不幸的是,因为我不能做“延伸”了两次,我不能让我的基地布局和自定义过滤表。所以丑陋的(因为打破HTML结构的一半)方式是简单地定义begin_filtered_table.htmlend_filtered_table.html。然后在定制的情况下,我有两个包裹包含定制,而对于未定制的情况下,filtered_form.html的定义是这样的:

{% include "begin_filtered_table.html" %} 

    {% for field in filter.form %} 
     {{ field.errors }} 
     {{ field.label_tag }} {{ field }} 
    {% endfor %} 

{% include "end_filtered_table.html" %} 

这在被总费用解决了这个问题。只要允许多个扩展就会容易得多。