1

我在 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 expire_date 来存储。

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

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

如果我的模块在模板标签中,我将 HTML 代码放入并返回它,如果条件为真:

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

3 回答 3

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()
于 2013-11-15T11:55:25.297 回答
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 标签的代码来了解它是如何完成的。

于 2013-11-15T10:45:42.360 回答
0

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

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

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

于 2013-11-15T11:01:04.523 回答