【问题标题】:Django conditional template inheritanceDjango 条件模板继承
【发布时间】: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 %} 来获取面包屑和拆分的顶部菜单。不过,在这种情况下,我将不得不一直包含它。不再继承。考虑到我的要求,这是最佳选择吗?

【问题讨论】:

    标签: django inheritance templates conditional


    【解决方案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 %}
    

    哪个最适合你。

    问候;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-09
      • 2015-11-13
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      相关资源
      最近更新 更多