Jinja2:更改循环内variables的值

我想改变循环内循环外声明的variables的值。 但总是在变化,它保持循环之外的初始值。

{% set foo = False %} {% for item in items %} {% set foo = True %} {% if foo %} Ok(1)! {% endif %} {% endfor %} {% if foo %} Ok(2)! {% endif %} 

这使得:

 Ok(1)! 

所以到目前为止唯一的(坏)解决scheme是这样的:

 {% set foo = [] %} {% for item in items %} {% if foo.append(True) %} {% endif %} {% if foo %} Ok(1)! {% endif %} {% endfor %} {% if foo %} Ok(2)! {% endif %} 

这使得:

 Ok(1)! Ok(2)! 

但是,它是非常丑陋的! 还有其他更优雅的解决scheme吗?

也尝试基于字典的方法。 这似乎不太难看。

 {% set vars = {'foo': False} %} {% for item in items %} {% if vars.update({'foo': True}) %} {% endif %} {% if vars.foo %} Ok(1)! {% endif %} {% endfor %} {% if vars.foo %} Ok(2)! {% endif %} 

这也使得:

 Ok(1)! Ok(2)! 

你可以这样做清理模板代码

 {% for item in items %} {{ set_foo_is_true(local_vars) }} {% if local_vars.foo %} Ok(1)! {% endif %} {% endfor %} {% if local_vars.foo %} Ok(2)! {% endif %} 

并在服务器代码中使用

 items = ['item1', 'item2', 'item3'] #--------------------------------------------- local_vars = { 'foo': False } def set_foo_is_true(local_vars): local_vars['foo'] = True return '' env.globals['set_foo_is_true'] = set_foo_is_true #--------------------------------------------- return env.get_template('template.html').render(items=items, local_vars=local_vars) 

这可以概括为以下几点

 {{ set_local_var(local_vars, "foo", False) }} {% for item in items %} {{ set_local_var(local_vars, "foo", True) }} {% if local_vars.foo %} Ok(1)! {% endif %} {% endfor %} {% if local_vars.foo %} Ok(2)! {% endif %} 

并在服务器代码中使用

 items = ['item1', 'item2', 'item3'] #--------------------------------------------- local_vars = { 'foo': False } def set_local_var(local_vars, name, value): local_vars[name] = value return '' env.globals['set_local_var'] = set_local_var #--------------------------------------------- return env.get_template('template.html').render(items=items, local_vars=local_vars) 

正如文件中提到的那样:

请注意,循环中的赋值将在迭代结束时被清除,并且不能超出循环范围。

但从版本2.10开始,您可以使用命名空间:

  {% set ns = namespace(foo=false) %} {% for item in items %} {% set ns.foo = True %} {% if ns.foo %} Ok(1)! {% endif %} {% endfor %} {% if ns.foo %} Ok(2)! {% endif %}