2010-08-11 104 views
8

在Django的模板系统中,如果我有一个要使用if语句进行选择的块,我该怎么做?有没有一种方法可以在Django模板中使块可选

我是想这样的:

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

但是,这并不工作。有没有办法做到这一点,所以对于一个给定的值(在这种情况下为空),块不会被发出,并且基础模板使用原始值?

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

我有一页每页10条目。然后用户可以进入下一页并查看接下来的十个项目。对于每一个更进一步的页面,我们希望标题标签会说“Archive 1”或“Archive 10”,但如果他们回到原始页面,它就不再存档了,它应该只需转到已在基本模板中提供的原始网站标题即可。

+0

我不知道你的问题的答案,但你知道'默认'过滤器 - 这是否做你想要的? http://docs.djangoproject.com/en/dev/ref/templates/builtins/#default – 2010-08-11 13:18:53

+0

感谢Dominic,我正在寻找类似的东西,但我没有找到一种方法来分配默认值,我我试图弄清楚我是否可以在if语句中添加if语句? – Vernon 2010-08-11 13:33:32

回答

8

据我所知block是占位符在子模板中被“覆盖”。它们必须在“编译时”定义,而不是在“运行时”定义。

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

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

我遇到了类似的问题,我正在处理一个项目。以下是我解决它使用{{block.super}}从父块拉默认值:

我父模板包含:

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

我的孩子模板包含:

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

*注意:如果您打算在HTML标题标记中使用结果,您可能希望将代码封装在{%spaceless%} {%endspaceless%}中。

(它看起来像乔丹瑞特张贴在原来的问题的意见相同的解决方案我响应之前一点。)

+0

谢谢,我从一开始就知道,如果我在块内部陈述语句,我只是想知道,如果我想让一个块可选 - 我猜不是。 – Vernon 2010-08-13 06:08:25

+0

太棒了!这使我可以根据表单值打开/关闭块(所以我可以得到可打印版本的结果)。 – sage 2015-10-05 03:01:40

+1

'{{block.super}}'做了诀窍。 – AliBZ 2016-05-26 18:05:44

0

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

我使用Django 1.8,每当我把{{ block.super }}它开始以这种方式来表现的,正如除了杰米的答案,我可以说的是,在基本模板你想

{% block title %} Default Title {% endblock %} 
你可以把内容

然后在孩子中,如果你想让页脚被继承和显示,就不要做任何事情。但是,如果你不想显示该块然后把标签的孩子与空内容,就像这样:

{% block title %} 

{% endblock %} 

然后,它会被隐藏,一旦它也变为可以覆盖,如果在其上的内容你希望。

相关问题