Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查Django自定义模板标记块中上下文变量的值_Django_Templates_Variables_Tags - Fatal编程技术网

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

检查Django自定义模板标记块中上下文变量的值,django,templates,variables,tags,Django,Templates,Variables,Tags,我正在尝试用Django编写一个自定义模板标记,它将执行以下操作: 获取开始标记和结束标记之间的所有上下文变量 如果所有变量都有有效的非空值(即非None或'),则返回整个块 否则(如果任何变量为空),返回空字符串(因此不会呈现任何内容) 我意识到我可以使用{%if-var1和var2和var3…以及varN%},但我更希望有一个自定义标记来执行此操作,这样我就不必每次更改某个内容时都重复检查if语句 这是我当前的代码: 在模板_helpers.py中: @register.tag(name

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

  • 获取开始标记和结束标记之间的所有上下文变量
  • 如果所有变量都有有效的非空值(即非
    None
    '
    ),则返回整个块
  • 否则(如果任何变量为空),返回空字符串(因此不会呈现任何内容)
我意识到我可以使用
{%if-var1和var2和var3…以及varN%}
,但我更希望有一个自定义标记来执行此操作,这样我就不必每次更改某个内容时都重复检查
if
语句

这是我当前的代码:

在模板_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 %}
...
{%load template\u helpers%}
...
{%表示术语%}

{{term.word}}
{{term.part_of_speech}:{{term.definition}

{%iff%}

from:{{term.词源学}

{%endiff%} {%endfor%} ...

现在,
iff
块是空的,无论
term.词源中是否有有效值。它不应该检查每个条目的词源值,因为
iff
for
中。但是我不知道如何检查上下文变量。

您的过程过于复杂了。您应该在视图方法中执行此操作:

# 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 %}
{%if do\u all\u exist%}

from:{{term.词源学}

{%endif%}
您的流程过于复杂。您应该在视图方法中执行此操作:

# 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 %}
{%if do\u all\u exist%}

from:{{term.词源学}

{%endif%}
你让事情变得更困难了。我认为,这对于模板标签来说太多了

你为什么不这样做呢

{% if term.etimology %}
    <p class="etymology">from: {{ term.etymology }}</p>
{% endif %}
{%if term.etimology%}

from:{{term.词源学}

{%endif%}
你让事情变得更困难了。我认为,这对于模板标签来说太多了

你为什么不这样做呢

{% if term.etimology %}
    <p class="etymology">from: {{ term.etymology }}</p>
{% endif %}
{%if term.etimology%}

from:{{term.词源学}

{%endif%}
这对于模板标记来说有点太多了。您应该在视图中执行逻辑并将数据呈现给Template您需要解析出块中的所有标记,并计算自由变量和绑定变量,然后在顶层检查自由变量。我也做了类似的工作,试图找到模板使用的、视图未定义的所有变量。代码相当粗糙,但它可能会给你一些想法。(如果您只是关心
{{values}}
问题就容易多了……)对于模板标记来说,这有点太多了。您应该在视图中执行逻辑并将数据呈现给Template您需要解析出块中的所有标记,并计算自由变量和绑定变量,然后在顶层检查自由变量。我也做了类似的工作,试图找到模板使用的、视图未定义的所有变量。代码相当粗糙,但它可能会给你一些想法。(如果你只是关心
{{values}}
问题就容易多了.)@ShangWang@doniyor当然,但我不想检查所有可能的上下文变量是否都存在。我只想检查iff块内的那些。例如,如果我想打印标志,当且仅当某个条目存在时,使用此
all_exist
将不适用于有标志但没有词源的条目。@jensenstrop如果我正确理解了您的意思。。。更新了我的回答,但我想让标签检查整个街区。很多时候,我的
if
块中有五到六个变量。。。我不希望它突然不打印,因为我去掉了其中一个变量。但是,我的意思是,我可以这样做。。。确保我的if语句始终具有正确的块标记将是一件痛苦的事情。如果没有
if
语句,我认为你不可能做到这一点,除非你试图在
if
中呈现的内容对于所有变量都是相同的。@ShangWang@doniyor-sure,但我不想检查是否所有可能的上下文变量都存在。我只想检查iff块内的那些。例如,如果我想打印标志,当且仅当某个条目存在时,使用此
all_exist
将不适用于有标志但没有词源的条目。@jensenstrop如果我正确理解了您的意思。。。更新了我的回答,但我想让标签检查整个街区。很多时候,我的
if
块中有五到六个变量。。。我不希望它突然不打印,因为我去掉了其中一个变量。但是,我的意思是,我可以这样做。。。确保if语句始终具有正确的块标记将是一件痛苦的事情。我认为如果没有
if
语句,就无法实现这一点,除非您试图在
if
中呈现的内容对于所有变量都是相同的。