Django条件模板继承

时间:2010-04-04 17:36:26

标签: django inheritance templates conditional

我有模板显示对象元素,其中包含指向我网站其他部分的超链接。我有另一个函数显示同一对象的过去版本。在这个显示中,我不想要超链接。

我假设我无法动态关闭超链接,所以我在同一模板中包含了两个版本。我使用if语句来显示超链接版本或纯文本版本。我更喜欢将它们保存在同一个模板中,因为如果我需要更改一个模板的格式,那么很容易将它应用到另一个模板中。

模板扩展了framework.html。 Framework有一个breadcrumb系统,它扩展了base.html。 Base有一个简单的顶级菜单系统。

所以这就是我的困境。查看标准超链接数据时,我想查看顶部菜单和面包屑。但是在查看过去版本的纯文本数据时,我只想要数据,没有菜单,没有面包屑。鉴于我目前的设计,我不确定这是否可行。我尝试让框架继承主模板,以便我可以选择调用框架(并显示面包屑)或模板本身,从而跳过面包屑,但我也希望framework.html可用于其他模板。如果framework.html扩展了特定模板,我就无法在其他模板中显示它。

我尝试编写一个if语句,分别显示base.html和framework.html中的top_menu块和nav_menu块。这将覆盖他们的块并允许我以if为条件关闭这些元素。不幸的是,它似乎没有条件;如果块元素完全在模板中,由if或不包围,我会丢失菜单。

我考虑使用{%include%}来获取面包屑和拆分顶部菜单。在那种情况下,我将不得不一直包括它。没有更多的继承权。根据我的要求,这是最好的选择吗?

2 个答案:

答案 0 :(得分:2)

您可以将超链接放在由加载模板覆盖的block内。

假设你有这样的framework.html

{% extends "base.html" %}

<html>...<body>...
{% block hyperlinks %}
your hyperlinks here
{% endblock %}
rest of the code
</body></html>

然后,您可以创建nolinks.html模板的某些内容并使用它

{% extends "framework.html" %}
{# here you'll have everything from framework
but now we disable the breadcrumbs #}
{% block hyperlinks %}{% endblock %}

如果您收到过去的数据,则可以使用 nolinks 代替框架进行渲染。

我希望这会有所帮助。

答案 1 :(得分:1)

从这里开始:Any way to make {% extends '...' %} conditional? - Django

可以这样做:

{% extends ajax|yesno:"ajax_base.html,main_base.html" %}

或者:

{% extends a_variable_containing_base_template_name %}

最适合你的。

问候;