Django 条件模板继承

Posted

技术标签:

【中文标题】Django 条件模板继承【英文标题】:Django conditional template inheritance 【发布时间】:2011-02-04 05:45:46 【问题描述】:

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

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

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

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

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

我考虑过使用 % include % 来获取面包屑和拆分的顶部菜单。不过,在这种情况下,我将不得不一直包含它。不再继承。考虑到我的要求,这是最佳选择吗?

【问题讨论】:

【参考方案1】:

您可以将超链接放在被加载模板覆盖的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 代替 framework 进行渲染。

我希望这会有所帮助。

【讨论】:

我真的很喜欢这个主意。它让我参与其中。问题是我仍然需要为我需要禁用菜单的每个模板提供一个“nolinks”页面。因为 nolinks 页面扩展了一个特定的模板,所以它一次只链接到一个。我尝试包含 nolinks 页面,而不是直接调用它,但似乎包含没有选择禁用必要部分的块标签 我的想法是有一个单一的 nolinks 页面,只需定义空块。那么你所有没有链接的模板都可以extend nolinks 而不是扩展framework。如果您发现自己将模板数量加倍来执行此操作,请尝试将变量传递给模板并使用 % if dontshowlinks %% block hyperlinks %% endblock %% endif % 之类的东西。 我不认为你可以让块标签有条件。那是我原来的问题。我最终传递了一个变量并根据该条件的分辨率是否包含菜单。【参考方案2】:

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

可以这样做:

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

或者:

% extends a_variable_containing_base_template_name %

哪个最适合你。

问候;

【讨论】:

以上是关于Django 条件模板继承的主要内容,如果未能解决你的问题,请参考以下文章

[py]django模板继承

Django模板——模板继承

Django模板继承和引用

Django模板的继承

django 模板的继承

Django 第六课 模板继承