Django templatetag返回True或False

时间:2013-11-15 10:29:13

标签: python django django-templates django-admin

我正在覆盖Django中admintemplate的index.html。 我想在侧边栏上添加一个额外的字段,只有在一个转义为真时才会显示。

以下是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 %}

这是我的模板标签:

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

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

最好的方法是什么?

编辑: 这里有一些代码可以向您展示我正在做什么: 我有一个模型帐户,如果一个帐户过期,它有一个DateTimeField expiration_date来存储。

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

EDIT2: 我解决了它,但我不知道它是否是一种非常优雅的方式。由于我没有足够的声誉回答我自己的问题,我需要在这里分享我的解决方案:

如果my-module位于templatetag中,我将HTML-Code放入并返回,如果条件为True:

@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 %}

3 个答案:

答案 0 :(得分:1)

您的第一种方法(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()

答案 1 :(得分: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 %}

你可以通过查看Gargoyle的代码来了解它是如何完成的 ifswitch tag

答案 2 :(得分:0)

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

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

(另请注意,您的代码效率非常低,因为它可能涉及获取所有未来的Account个对象。您应该if exp.exists()执行简单的存在检查。)