【问题标题】:Nested blocks in Django templatesDjango 模板中的嵌套块
【发布时间】:2010-12-26 10:22:37
【问题描述】:

我的 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,如果这很重要的话。

【问题讨论】:

  • 这里还有其他问题,因为(也使用 1.1)我无法复制这个问题。对我来说,简单地覆盖子块,而不引用父块,就能达到预期的效果。
  • 是的,你是对的。请看下面我的回答。感谢您的关注。

标签: django templates django-templates nested


【解决方案1】:

这样做:

{% extends "master.html" %}

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

【讨论】:

  • 如果基本parent 块包含child 块以外的任何内容怎么办?
  • 感谢您的回答,但不幸的是它没有用。这部分是我的错误,我更新了上面主模板的示例。问题:主模板的原因是,里面有更多的数据。如果我按照你的建议去做,那么所有这些额外的数据当然会丢失。
  • 这样做可能会破坏网站功能,它会请求 2 次子页面,因此可能会重复脚本标签等等。
【解决方案2】:

好的,这是 Django 模板系统中的一个错误。对于大多数其他情况,Ben James 是对的(请参阅他对我上面问题的评论)。

在我的例子中,child 块位于 {% ifnotequal a b %} 块内,而 破坏了块继承。我认为这是一个错误,因为此类操作有许多自然用例。

The corresponding ticket.

【讨论】:

  • 最好始终测试您发布的代码,而不是假设您取出的内容不会影响结果。
  • 没错,没错...我一开始有一个自定义模板标签并怀疑它,但在扔掉它之后我没有考虑ifnotequal。
猜你喜欢
  • 2011-08-20
  • 2012-02-01
  • 2012-10-25
  • 2014-03-04
  • 2021-03-28
  • 2012-07-09
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
相关资源
最近更新 更多