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 %}