在Django的模板系统中,如果我想使用if语句创建一个可选块,我该怎么做?
我正在尝试这个:
{% if val %}{% block title %}Archive {{ foo }}{% endblock %}{% endif %}
但这不起作用。有没有办法做到这一点,所以对于给定的值(在这种情况下为空),不发布块,基本模板使用原始值?
编辑: 让我更具体一点,以便更容易回答。
我的页面每页有10个条目。然后,用户可以转到下一页并查看下十个项目。对于他们去的每个进一步的页面,超过第一个,我想要标题标签说“存档1”或“存档10”,但如果他们回到原始页面,它不再存档,它应该只需转到基本模板中已经提供的原始网站标题。
答案 0 :(得分:21)
我遇到了一个与我正在进行的项目类似的问题。以下是我使用{{block.super}}从父块中提取默认值的方法:
我的父模板包含:
{% block title %}Default Title{% endblock %}
我的孩子模板包含:
{% block title %}
{% if new_title %}{{ new_title }}{% else %}{{ block.super }}{% endif %}
{% endblock %}
*注意:如果您打算在HTML标题标记中使用结果,则可能需要将代码包装在{%spaceless%} {%endspaceless%}中。
(在我回答之前,看起来Jordan Reiter在原始问题的评论中发布了相同的解决方案。)
答案 1 :(得分:9)
据我所知,block
是占位符在子模板中被“覆盖”。它们必须在“编译时”定义,而不是在“运行时”定义。
至于你的具体问题,为什么不根据页码修改标题(假设你使用分页)?像这样:
{% block title %}
{% ifequal page 1 %}Current{% else %}Archive {{ page }}{% endifequal %}
{% endblock %}
答案 2 :(得分:0)
我只需要添加上面的好答案,取决于Django版本,有时.as-console-wrapper { max-height: 100% !important; top: 0; }
会将主内容 两次 ,这个似乎发生在Django的最新版本中。
我正在使用Django 1.8,每当我把{{ block.super }}
开始以这种方式表现就像Jamie的回答一样,我可以说在基本模板中你可以放置你想要的内容
{{ block.super }}
然后在孩子中,如果你想要继承并显示页脚,那就不要做任何事情了。但是,如果您不希望显示该块,则将标记放在具有空内容的子项中,如下所示:
{% block title %} Default Title {% endblock %}
然后,一旦渲染它将被隐藏,如果你愿意,你也可以覆盖它上面的内容。