覆盖Django中的内部模板块

时间:2011-03-23 12:32:57

标签: django inheritance django-templates

我有以下模板结构(为简洁起见而简化):

base1.html

<html>
    <head>{% block head %}{% endblock %}</head>
    <body>{% block body %}{% endblock %}</body>
</html>

base2.html

{% extends "base1.html" %}
{% block head %}
    <meta .... />
    <title .... />
    css includes etc.
{% endblock %}
{% block body %}
    {% block header %}{% endblock %}
    {% block featured %}{% endblock %}
    {% block navigation %}{% endblock %}
    {% block content %}{% endblock %}
    {% block footer %}{% endblock %}
{% endblock %}

base3.html base4.html ,这进一步明确了之前基本模板中定义的通用主体结构(此处未显示)。最后一个模板扩展了 base4.html ,覆盖了具体内容的块(标记由基本模板处理)。

问题是:我有两个模板: main.html article.html ,它们都扩展了 base4.html 。但是在 article.html 中,我希望 base2.html 中定义的正文块的顺序不同(精选块在之后)导航)。我怎样才能做到这一点?或者如何重构模板结构以实现这一目标?覆盖顶级模板中的块 body 不起作用。

2 个答案:

答案 0 :(得分:2)

我认为你不会有这样的运气。一个简单的解决方案可能是有一个base2.html查看的可选变量,它决定了备用顺序。实际上,甚至可以在article.html模板本身中定义此变量的存在。我没有尝试过,但以下内容可能有效:

{% with alternate_order=1 %}
    {% include base4.html
{% endwith %}

答案 1 :(得分:1)

为什么你有这么多级别的继承?作为一个注释,django没有任何限制,但通常我们使用三级方法。见docs

以下是一些建议:

  • 您可以将base1.html和base2.html结合使用。
  • 如果您可以将html代码放在父级中,那么就这样做。我通常会像这样实现我的模板:
    • <div id='sidebar'>{% block sidebar_content %}{% endblock %}</div>

至于你的问题,如果你需要一个不同的布局,那就是你的分支。也就是说,如果使用不同的CSS不起作用。