2013-11-15 151 views
1

我正在覆盖Django中admintemplate的index.html。 我想在侧边栏上添加一个额外的字段,只有在接口为真时才会显示该字段。Django templatetag return True或False

这里为m的index.html的重要组成部分:

{% block sidebar %} 
<div id="content-related"> 
{% if action_needed %} 
    <div class="my-module"> 
     <h2>Foobar</h2> 
     <p>Display this over the sidebar</p> 
    </div> 
{% endif %} 
... Sidebarstuff... 
{% endblock %} 

这里是我的templatetag:

@register.simple_tag 
def action_needed(): 
    if some_conditon: 
     return True 
    else: 
     return False 

的问题是,是,我的模块显示所有的时间。 在另一个线程中,我读到有关使用过滤器而不是模板标签,但Django文档说,至少需要1个参数用于过滤器。但我只是想要一个真/假的回报。

这样做的最好方法是什么?

编辑: 这里有更多的代码,以显示你究竟是什么即时通讯做: 我有具有DateTimeField字段到期日期来存储,如果帐户过期模型帐户。

exp = Account.objects.filter(expiration_date__lte = timezone.now()) 
if len(exp) == 0: 
    return False 
else: 
    return True 

EDIT2: 我解决了这个问题,但我不知道,如果它是一个非常优雅的方式。因为我没有足够的reputition回答我的问题,我需要在这里分享我的解决方案:

我把HTML的代码,如果templatetag内我的模块并返回,如果条件为真:

@register.simple_tag 
def action_needed(): 
    if some_conditon: 
     return '<div class="my-module"><h2>Foobar</h2><p>Display this over the sidebar</p></div>' 
    else: 
     return '' 

在模板现在我只需要调用

{% action_needed %} 
+0

什么是'some_condition'?它依赖于什么? –

+0

这取决于没有。只需检查我的数据库中是否有模型的对象 – 0xAffe

+0

如果您创建了一个过滤器,可以将正在数据库中检查的模型的名称作为参数 –

回答

0

你的第一种方法(action_needed标签返回布尔值+ if标记)不起作用导致模板标签不能用作另一个模板的“参数”,因此您的{% if action_needed %}尝试在上下文中尝试解析变量,其名称为action_needed

如果测试(“some_condition”)在目前情况下取决于某个对象可用,您可以使用应用到该对象的自定义过滤器,即:

@register.filter 
def action_needed(obj): 
    return some_test_on(obj) 

{% if obj|action_needed %} 
    whatever 
{% endif %} 

否则,好了,你或者可以写入一个赋值标签在上下文中设置标志,然后测试标志,或者像你最终做的那样,写一个标签来做测试并返回合适的html代码片段。

正如一个侧面说明 - 这一点:

exp = Account.objects.filter(expiration_date__lte = timezone.now()) 
if len(exp) == 0: 
    return False 
else: 
    return True 

是写这一个复杂的方式:

return len(Account.objects.filter(expiration_date__lte=timezone.now())) > 0 

这是写一个低效的方式:

return Account.objects.filter(expiration_date__lte=timezone.now()).exists() 
+0

那么,我的解决方案还行吗?我认为这可能会有点“不好的风格”,如果你知道我的意思。 – 0xAffe

+0

有模板标签生成HTML片段是好的,是的。至于是否更好地使用assignement标签在上下文中设置标志,然后测试该标志并相应地执行或者使templatetag处理测试和生成html(或纯文本或其他)代码段,它真的取决于具体的用例和你自己的喜好。我唯一的观察是关于命名 - 'action_needed'对于谓词来说是一个好名字,但对于包含标签来说不是这样。 –

+0

[转码标签](https://docs.djangoproject.com/en/1.5/howto/custom-template-tags/#assignment-tags)非常棒!谢谢。 – 0xAffe

0

您可以创建一个自定义模板标签,如果条件满足,检查。如果它是真的,则在标签之间呈现html。

{% block sidebar %} 
<div id="content-related"> 
{% ifaction %} 
    <div class="my-module"> 
     <h2>Foobar</h2> 
     <p>Display this over the sidebar</p> 
    </div> 
{% endifaction %} 
... Sidebarstuff... 
{% endblock %} 

你可以看到它是如何通过查看石像鬼的 ifswitch tag的代码来完成。

+0

传递给我,在做什么?您只在{%if action%} – 0xAffe

+0

之间移除了一个空格我的意思是您创建了一个名为ifaction的自定义模板标记,而不是使用模板标记的标准django。 – user2995894

0

你可以在这里采取几种方法。其中一个想法是将some_condition检查作为上下文处理器,因此它会自动包含在所有模板中 - 尽管如果您只希望在一个模板中使用它,那就太过于夸张了。

更好的方法是使用包含标签。这样,目前在{% if action_needed %}标签内的代码将位于一个单独的模板片段中,只有在条件为真时才被包含。或者,您可以使用分配代码在上下文中设置变量,然后在if内对其进行检查。

(另请注意,你的代码是非常低效的,因为它可能涉及到让所有未来Account对象。你应该做if exp.exists()做了一个简单的存在性检查来代替。)

+0

谢谢你的帮助。我用另一种方式解决了它。问题是,我无法回答我自己的问题,因为我没有足够的声誉...... – 0xAffe