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