我正在覆盖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 %}
答案 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()
执行简单的存在检查。)