我试图在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
内。但我对如何检查上下文变量感到很遗憾。
答案 0 :(得分:0)
您的过程过于复杂。您应该在views方法中执行此操作:
# 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 %}
答案 1 :(得分:0)
你制造的东西比他们更难。我认为,这对模板标签来说太过分了。
为什么你不这样做?
{% if term.etimology %}
<p class="etymology">from: {{ term.etymology }}</p>
{% endif %}