首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Django自定义模板标记块中检查上下文变量的值

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

Stack Overflow用户
提问于 2016-01-15 19:47:20
回答 2查看 1.5K关注 0票数 2

我试图在Django中编写一个自定义模板标记,它将执行以下操作:

  • 获取开始标记和结束标记之间的所有上下文变量
  • 如果所有变量都具有有效的非空值(即不是None''),则返回整个块。
  • 否则(如果任何变量为空),则返回空字符串(因此不会呈现任何内容)。

我意识到我可以使用{% if var1 and var2 and var3 ... and varN %},但是我更希望有一个自定义标记来完成它,这样我就不必每次更改if语句时都重复检查它。

这是我目前的代码:

在template_helpers.py中:

代码语言:javascript
复制
@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中:

代码语言:javascript
复制
{% 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中。但我不知道如何检查上下文变量。

EN

回答 2

Stack Overflow用户

发布于 2016-01-15 19:55:55

你把你的过程弄得太复杂了。您应该在视图方法中这样做:

代码语言:javascript
复制
# 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

然后在模板中:

代码语言:javascript
复制
{% if do_all_exist %}
    <p class="etymology">from: {{ term.etymology }}</p>
{% endif %}
票数 0
EN

Stack Overflow用户

发布于 2016-01-15 20:02:16

你让事情变得比他们更困难。我想,这对模板标签来说太过分了。

你为什么不直接这么做呢?

代码语言:javascript
复制
{% if term.etimology %}
    <p class="etymology">from: {{ term.etymology }}</p>
{% endif %}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34818721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档