我试图在Django中编写一个自定义模板标记,它将执行以下操作:
None或''),则返回整个块。我意识到我可以使用{% if var1 and var2 and var3 ... and varN %},但是我更希望有一个自定义标记来完成它,这样我就不必每次更改if语句时都重复检查它。
这是我目前的代码:
在template_helpers.py中:
@register.tag(name="iff")
def iff(parser,token):
nodelist = parser.parse(('endiff',))
parser.delete_first_token()
return IffNode(nodelist)
def do_all_exist(context):
sendback = True
for var in context:
if (var is None) or (var == ''):
sendback = False
if not sendback:
break
else:
continue
return sendback
class IffNode(template.Node):
def __init__(self,nodelist):
self.nodelist = nodelist
def render(self,context):
if do_all_exist(context):
return context
else:
return ''在template.html中:
{% load template_helpers %}
...
{% for term in terms %}
<div class="entry">
<p class="definition">
<big><b>{{ term.word }}</b></big>
<br /><b>{{ term.part_of_speech }}:</b> {{ term.definition }}
</p>
{% iff %}
<p class="etymology">from: {{ term.etymology }}</p>
{% endiff %}
</div>
{% endfor %}
...现在,无论iff中是否有有效值,term.etymology块都是空的。它不应该检查每个条目的词源的值,因为iff在for中。但我不知道如何检查上下文变量。
发布于 2016-01-15 19:55:55
你把你的过程弄得太复杂了。您应该在视图方法中这样做:
# this is the context you currently have
context = {foo: bar, baz: test}
# check if all context have values
do_all_exist = all(context.values())
# add the result to the context
context['do_all_exist'] = do_all_exist
# return the context with your HttpResponse然后在模板中:
{% if do_all_exist %}
<p class="etymology">from: {{ term.etymology }}</p>
{% endif %}发布于 2016-01-15 20:02:16
你让事情变得比他们更困难。我想,这对模板标签来说太过分了。
你为什么不直接这么做呢?
{% if term.etimology %}
<p class="etymology">from: {{ term.etymology }}</p>
{% endif %}https://stackoverflow.com/questions/34818721
复制相似问题