2009-12-14 65 views
19

在我的Django应用程序的master模板看起来是这样的:嵌套块

{% block parent %} 
    Some text... 
    {% block child %} 
     Default content here... 
    {% endblock child %} 
    ...some more text 
{% endblock parent %} 

现在,这个模板应该在某种程度上被覆盖了child块被改变:

{% extends "master.html" %} 

{% block child %} 
    New content here... 
{% endblock child%} 

但是,渲染保持不变(在此处打​​印“默认内容...”)。我错过了一些显而易见的东西,或者是嵌套块不可能? (或者,违反DRY原则,是否需要重新定义parent块?)

编辑:我正在使用Django 1.1,如果有问题。

+2

这里还有一些错误,因为(也使用1.1)我无法复制这个问题。对于我来说,简单地覆盖子块,不需要引用父块,就能获得理想的效果。 – 2009-12-14 13:34:02

+0

是的,你说得对。请参阅下面的答案。感谢您的关注。 – Boldewyn 2009-12-14 13:49:12

回答

9

OK,它在Django的模板系统中的错误。对于大多数其他情况,本詹姆斯是正确的(请参阅他对我上面的问题的评论)。

在我的情况下,child块在{% ifnotequal a b %}块内,而表示打破块继承。我认为这是一个错误,因为这类操作有几十个自然用例。

The corresponding ticket

+1

总是_test_你发布的代码是一个好主意,而不是假设你拿出的东西不会影响结果。 – 2009-12-14 14:09:16

+0

的确,真的......我首先有一个自定义的模板标签,并且怀疑是这样,但抛出后我没有考虑ifnotequal。 – Boldewyn 2009-12-14 15:17:22

1

这样做:

{% extends "master.html" %} 

{% block parent %} 
    {% block child %} 
     New content here... 
    {% endblock child%} 
{% endblock parent %} 
+3

如果基本“父”块包含“子”块以外的其他内容,该怎么办? – 2009-12-14 13:26:57

+2

感谢您的回答,但不幸的是它没有用。这部分是我的错误,我更新了上面主模板的示例。问题:主模板的原因是,其中有更多数据。如果我按照你的建议去做,所有这些额外的数据当然会丢失。 – Boldewyn 2009-12-14 13:28:24