2009-12-06 196 views
2

我使用的是Django 1.1,我有这个模板,一个基本模板,所有其他页面都从中继承。它定义了一堆的东西,是整个几乎所有的网站不断,这样的导航栏:Django中的模板继承

 <div id="navbar"> 
     {% block navbar %} 
      <a href="">Link 1</a> 
      <a href="">Link 2</a> 
      <a href="">Link 3</a> 
      <a href="">Link 4</a> 
      <a href="/admin/">Admin</a> 
     {% endblock %} 
    </div> 

但子模板内Django的默认行为是让孩子在父模板完全覆盖块。我已经在这里了解了这个页面,并不一定要覆盖navbar块,只需添加更多的条目到该页面即可,但现在我唯一能看到的就是如果我是从父级复制navbar块,然后将其包含在模板+我的添加中。有没有其他办法可以做到?

回答

7

在子模板中使用{{ block.super }}以包含来自父块的内容。

0

您不必定义所有块,因此如果您未在子页面中定义导航栏块,则会使用来自父项的块内容。

2

As Alasdair指出,{{ block.super }}允许您使用来自父级的值。

但是,如果你发现你总是需要这样做,你应该考虑你的块是否足够精细。您应该能够按照每个块只定义所需内容的方式进行布局。

2

您可以定义嵌套块,所以你也可以做这样的事情:需要覆盖整个导航栏可以这样做

<div id="navbar"> 
      {% block navbar %} 
        <a href="">Link 1</a> 
        <a href="">Link 2</a> 
        <a href="">Link 3</a> 
        <a href="">Link 4</a> 
        <a href="/admin/">Admin</a> 
        {% block navbar-extra %}{% endblock %} 
      {% endblock %} 
    </div> 

模板,而其他模板可以只覆盖“导航栏,额外”块。在你事先知道需要可扩展性的情况下,IMO比使用{{block.super}}要清洁一点;因人而异。