Flask Jinja2:局部/全局变量

Flask Jinja2:局部/全局变量,flask,jinja2,Flask,Jinja2,我有金甲2的模板。 我需要的是“禁用”变量在“for”循环外部可见。 这可能吗?默认情况下,块可能无法从外部作用域访问变量,您可以使用作用域修饰符覆盖这一点,如下所示: {% set disabled = '' %} {% for voter in record.voters %} {% if user == voter %} {% set disabled = 'disabled' %} {% endif %} {{ disabled }} # out

我有金甲2的模板。 我需要的是“禁用”变量在“for”循环外部可见。
这可能吗?

默认情况下,块可能无法从外部作用域访问变量,您可以使用
作用域
修饰符覆盖这一点,如下所示:

{% set disabled = '' %}
{% for voter in record.voters %}
    {% if user == voter %}
        {% set disabled = 'disabled' %}
    {% endif %}
    {{ disabled }}  # outputs: 'disabled'
{% endfor %}
{{ disabled }}  # outputs: ''

请参阅:

处理此问题的最简单方法是将设置禁用的
变量的逻辑移动到视图函数,并将其发送到准备使用的模板。将应用程序逻辑与表示混合在一起不是一个好主意,模板应该尽可能地接收数据摘要

这就是说,有一个丑陋的黑客使你想要的成为可能,在被接受的答案

解决方案包括为Jinja2启用
do
扩展,并使用它修改全局数组。要启用扩展,请使用:

{% for item in list scoped %}
{% endfor %}
以下是适用于您的示例的解决方案:

app.jinja_env.add_extension('jinja2.ext.do')

您可以像Miguel建议的那样使用array/dict,但不需要do扩展本身;您可以设置一个虚拟变量。我使用以下命令:

{% set disabled = [] %}
{% for voter in record.voters %}
    {% if user == voter %}
        {% do disabled.append(1) %}
    {% endif %}
{% endfor %}
{% if disabled %}
    disabled
{% endif %}
在顶部,然后在我的代码中:

{% set glob={} %}

变量只是一个伪变量,以后不要使用它

我意识到我在回答一个老问题。然而,我最近开始使用Jinja,遇到了类似的问题:我需要计算嵌套循环中打印行的数量。我的解决方案是在类中包装一个计数器变量,并将一个实例传递给模板。类似地,您可以使用包装器类,如下所示

{% set _ = glob.update({'disabled':True}) %}
相应地修改模板

class VoterStatus(object):
    def __init__(self, status='active'):
        self._status = status

    def set_disabled(self):
        self._status = 'disabled'

    def __str__(self):
        return self._status
将状态类实例传递给模板以进行渲染:

{% for voter in record.voters %}
    {% if user == voter %}
        {% status.set_disabled() %}
    {% endif %}
    {{ status }}  # outputs: 'disabled'
{% endfor %}

…还有Bob的叔叔。

从2.10版开始,更复杂的用例可以使用名称空间对象来处理,这些对象允许跨范围传播更改:

tmplt.render(status=VoterStatus(), ...)

@c00p3r.web在这种情况下,我建议为jinja2打开一个问题,因为这似乎是所需的功能:这是一个很好的解决方案,遗憾的是它只在嵌套的blocks/loops.thx中工作。我已经修改了我的代码,一开始就按照你的建议做了。很好,有点粗糙,但这就是我所需要的
{% set ns = namespace(found=false) %}
{% for item in items %}
    {% if item.check_something() %}
        {% set ns.found = true %}
    {% endif %}
    * {{ item.title }}
{% endfor %}
Found item having something: {{ ns.found }}