【问题标题】:Is there a way to make a block optional in Django template有没有办法在 Django 模板中使块可选
【发布时间】:2011-03-28 09:10:41
【问题描述】:

在 Django 的模板系统中,如果我想使用 if 语句将一个块设为可选,我该怎么做?

我正在尝试这个:

{% if val %}{% block title %}Archive {{ foo }}{% endblock %}{% endif %}

但这不起作用。有没有办法做到这一点,以便对于给定的值(在这种情况下为 Null)不会发出块并且基本模板使用原始值?

编辑: 让我更具体一点,以便更容易回答。

我有一个页面,每页有 10 个条目。然后用户可以进入下一页并查看接下来的十个项目。对于他们去的每一页,过去的第一页,我想让标题标签说“存档 1”或“存档 10”,但如果他们回到原始页面,它不再是存档,它应该只需转到基本模板中已经给出的原始网站标题。

【问题讨论】:

  • 我不知道您的问题的答案,但您知道default 过滤器 - 是否符合您的要求? docs.djangoproject.com/en/dev/ref/templates/builtins/#default
  • 谢谢多米尼克,我正在寻找类似的东西,但我不是在寻找分配默认值的方法,我想弄清楚是否可以在块周围放置 if 语句?

标签: django django-templates


【解决方案1】:

我只需要补充上面的好答案,取决于 Django 版本,{{ block.super }} 有时会将主文件中的内容 两次,这似乎发生在最新版本的 Django 中。

我正在使用 Django 1.8,每当我输入 {{ block.super }} 时,它就会开始以这种方式运行,就像对 Jamie 答案的补充一样,我可以说在基本模板中你可以放置你想要的内容

{% block title %} Default Title {% endblock %}

然后在孩子中,如果您希望页脚被继承和显示,请不要做任何事情。但是,如果您不希望显示该块,则将标签放在内容为空的子项中,如下所示:

{% block title %}

{% endblock %}

然后它会在渲染后被隐藏,如果你愿意,你也可以覆盖上面的内容。

【讨论】:

    【解决方案2】:

    我在进行的一个项目中遇到了类似的问题。以下是我使用 {{ block.super }} 从父块中提取默认值来解决它的方法:

    我的父模板包含:

    {% block title %}Default Title{% endblock %}
    

    我的子模板包含:

    {% block title %}
        {% if new_title %}{{ new_title }}{% else %}{{ block.super }}{% endif %}
    {% endblock %}
    

    *注意:如果您打算在 HTML 标题标签中使用结果,您可能需要将代码包装在 {% spaceless %}{% endspaceless %} 中。

    (看起来 Jordan Reiter 在我回复之前在原始问题的 cmets 中发布了相同的解决方案。)

    【讨论】:

    • 谢谢,我从一开始就知道我可以将 if 语句放在块中,我只是想知道,我想,如果我将块设为可选 - 我想不会。
    • 太棒了!这让我可以根据表单值打开/关闭块(这样我就可以获得结果的可打印版本)。
    【解决方案3】:

    据我了解,blocks 是要在子模板中“覆盖”的占位符。它们必须在“编译时”而不是在“运行时”定义。

    至于您的具体问题为什么不根据页码修改标题(假设您使用分页)?像这样的:

    {% block title %}
        {% ifequal page 1 %}Current{% else %}Archive {{ page }}{% endifequal %}
    {% endblock %}
    

    【讨论】:

      猜你喜欢
      • 2022-01-05
      • 2015-03-18
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-24
      • 2017-12-20
      相关资源
      最近更新 更多