Python 如何访问Jinja2以获取循环外的循环变量?
我有一个Jinja2模板页面,其中包含两个独立的Python 如何访问Jinja2以获取循环外的循环变量?,python,jinja2,Python,Jinja2,我有一个Jinja2模板页面,其中包含两个独立的{%for%}循环。如果这两个循环都不包含任何项,我希望页面重定向 我正在尝试这样做(伪代码): 这可能吗?有没有办法使循环.length变量在各自的循环之外可用?您可以检查您的列表是否正确,空列表在Jinja2中是错误的 {% if things %} {% for thing in things %} .... {% endfor %} {% else %} <!-- redirect here --> {% end
{%for%}
循环。如果这两个循环都不包含任何项,我希望页面重定向
我正在尝试这样做(伪代码):
这可能吗?有没有办法使
循环.length
变量在各自的循环之外可用?您可以检查您的列表是否正确,空列表在Jinja2中是错误的
{% if things %}
{% for thing in things %} .... {% endfor %}
{% else %}
<!-- redirect here -->
{% endif %}
{%if things%}
{%表示事物中的事物%}。。。。{%endfor%}
{%else%}
{%endif%}
简单的答案是“否”:您不能直接使用模板——它应该在控制器/服务器的视图逻辑中
虽然从技术上讲,一个人可以,但不能帮任何人任何忙。假设这两件事都是列表,你可以这样做:
{% set all_things = thing1 + thing2 %}
{% if all_things %}
{# There is more than one thing in the two lists #}
{% else %}
{# redirect #}
这就是说,这是而不是属于模板级别的内容-您每次点击页面时都会生成另一个列表,其中包含thing1
和thing2
中的所有内容,这将在资源方面产生成本。您正在将应用程序逻辑置于模板级别,这将不可维护。最后,您正在掩盖一个更大的问题,即更改后端代码代价高昂。(请理解,在所有这些情况下,“你”都是通用的“你”——如“你工作的公司”)
你(特别是)应该向那些要求你实施此黑客攻击的人提出这些问题,并尝试在该工具/产品/公司成为FrankenCode的一部分之前改变其发展方向
祝你好运 您可以使用以下命令检查长度
事物对象(您正在循环的对象):
现在回答你的问题。假设循环通过的对象名为t1
和t2
,可以执行以下操作:
{% if t1 | length == 0 and t2 | length == 0 %}
//use javascript to redirect(assuming you have the link)
{% endif %}
您可以在JavaScript块中执行此操作。我不知道这是否是最有效的方法,但是,它应该有效
我发布这个答案,因为这个问题没有经过投票或被接受的答案。
我真希望这能有所帮助。呃。。重定向需要来自服务器,与模板无关。请尝试第一个循环{%set i=loop.counter0%}
第二个循环{%set j=loop.counter0%}
条件{%if i+j等于0%}
这是我首先尝试的,但是i和j并不存在于它们各自的循环之外,每个循环每次迭代都会在页面上放置一个div,这些div共享一个其他地方找不到的类、文本等。在两个循环都运行之后,有没有一种方法可以简单地说,“如果这个类或文本在页面上不存在,重定向”?我意识到,但在这种情况下,我别无选择,项目(希望)不会需要很长时间,并且决定这样做比在后端改变东西要容易。然后你只需在中间代理重定向规则——听起来像是一种可怕的方式。though@DsDyer:那么你应该问那些认为编写代码很容易的人,并反驳那些声称代码不容易的人,简单。这里的问题是我正在过滤条件,所以它实际上是{%for things in things if not thing.attribute%},那么我如何测试“things if not thing.attribute”是否为真?
{{things|length}}
{% if t1 | length == 0 and t2 | length == 0 %}
//use javascript to redirect(assuming you have the link)
{% endif %}