检查Django自定义模板标记块中的上下文变量的值

时间:2016-01-15 19:47:20

标签: django templates variables tags

我试图在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块都为空。它不应该检查每个条目的词源的值,因为ifffor内。但我对如何检查上下文变量感到很遗憾。

2 个答案:

答案 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 %}