如何覆盖Django的基础模板

6

我需要扩展我的Django应用程序中页面的基本模板,但是有一些HTML元素我需要从这个新页面中排除,这些元素在基础模板中。最好的方法是什么?我只需使用JQuery删除这些元素吗?

2个回答

10
你可以使用模板块来实现这一点。例如,在base.html中,将HTML元素包裹在一个命名块中:
{% block a_unique_name %}<div>This is only relevant in base.html</div>{% endblock %}

如果没有其他的模板覆盖,那么块中的HTML将被使用。您可以像这样在子模板中覆盖它:

{% extend base.html %}
{% block a_unique_name %}{% endblock %}

现在来自子模板的值将被使用并将覆盖base.html中的默认值。


0

创建不包含这些元素的基础模板。创建包含这些元素的子模板。从基础模板继承所有页面和特定页面的子模板。

另一种方法是将这些元素放入基础模板中的块中。

{# base template #}
{% block override_me %}
<elem1 /><elem2 />
{% endblock %}

{# child template #}
{% block override_me %}{% endblock %}

这并不一定是一个坏主意。如果必须在几个子模板中重新创建代码,只是为了避免将其放入base.html中,那么它就违反了DRY原则。使用块更好。 - George Cummins
@George Cummins 用JS删除元素不一定是个坏主意?好的。请指出DRY原则在哪里被违反了(请注意,这种方法例如在django网站中被使用)。 - DrTyrsa
显然,我对你的“不好的想法”评论指向了原问题的哪个部分并不清楚。在子模板中删除元素并不是一个问题,但我同意通过JS删除元素并不理想。如果你重新修改你回答的第一段,我可以取消我的投票反对。 - George Cummins
@George Cummins,我认为我的第一个变体仍然更好,如果您需要删除基本模板的某些元素,则这是模板组织存在问题的第一个迹象。 - DrTyrsa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接