gpt4 book ai didi

python - Django 模板标签返回 True 或 False

转载 作者:太空宇宙 更新时间:2023-11-03 18:43:47 26 4
gpt4 key购买 nike

我正在覆盖 Django 中管理模板的index.html。我想在侧边栏上添加一个额外的字段,该字段仅在条件为真时才显示。

这是mindex.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

问题是,my-module 一直显示。在另一个线程中,我读到有关使用过滤器而不是模板标签的内容,但 Django 文档说,过滤器至少需要 1 个参数。但我只是想要一个 True/False 返回值。

最好的方法是什么?

编辑:这里有更多代码来向您展示我到底在做什么:我有一个模型帐户,如果帐户过期,它有一个 DateTimeFieldexpiration_date 来存储。

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

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

如果条件为 True,我将 HTML 代码 if my-module 放入 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 %}

最佳答案

您的第一种方法(action_needed 标记返回 bool 值 + 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()

关于python - Django 模板标签返回 True 或 False,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19998912/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com