2010-04-04 108 views
2

我有模板显示对象元素的超链接到我的网站的其他部分。我有另一个功能,显示同一个对象的过去版本。在这个显示中,我不想要超链接。Django的条件模板继承

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

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

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

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

我曾考虑过使用{%include%}来选取面包屑和分割顶部菜单。但在那种情况下,我必须一直包括它。没有更多的继承。根据我的要求,这是最佳选择吗?

回答

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 %} 

如果你碰到了以前的数据,你可以再使用ninkink来渲染而不是框架

我希望这会有所帮助。

+0

我非常喜欢这个想法。它让我成为那里的一部分。问题是我仍然需要一个“nolinks”页面来显示禁用菜单所需的每个模板。由于nolinks页面扩展了特定的模板,因此它只能链接到一个模板。我尝试了包括nolinks页面,而不是直接调用它,但看起来包括没有选择禁用必要部分的块标记 – 2010-04-04 21:18:52

+0

我的想法是只有一个nolinks页面,只是定义了空块。然后,所有没有链接的模板可以'扩展nolinks'而不是扩展''framework''。如果您发现自己的模板数量增加了一倍,则可以尝试将一个变量传递给模板,并使用类似'{%if dontshowlinks%} {%block hyperlinks%} {%endblock%} {%endif%}' 。 – 2010-04-05 22:09:11

+0

我不认为你可以使块标签条件。这是我原来的问题。我最终传递了一个变量,并根据该条件的解析结果包含菜单。 – 2010-04-06 01:35:41