Ich möchte den Wert der außerhalb der Schleife deklarierten Variablen innerhalb einer Schleife ändern. Wenn Sie sich jedoch ständig ändern, bleibt der Anfangswert außerhalb der Schleife.
{% set foo = False %}
{% for item in items %}
{% set foo = True %}
{% if foo %} Ok(1)! {% endif %}
{% endfor %}
{% if foo %} Ok(2)! {% endif %}
Dies macht:
Ok(1)!
Die einzige (schlechte) Lösung, die bisher gefunden wurde, war folgende:
{% set foo = [] %}
{% for item in items %}
{% if foo.append(True) %} {% endif %}
{% if foo %} Ok(1)! {% endif %}
{% endfor %}
{% if foo %} Ok(2)! {% endif %}
Dies macht:
Ok(1)!
Ok(2)!
Aber es ist sehr hässlich! Gibt es eine andere elegantere Lösung?
Jinja Annoyances
jinja2.ext.do
, um sie zu bereinigen ein bisschenAntworten:
Versuchen Sie auch einen wörterbuchbasierten Ansatz. Es scheint weniger hässlich zu sein.
{% 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 %}
Dies macht auch:
Ok(1)! Ok(2)!
quelle
set vars
einfach nicht in einer for-Schleife?wie in der Dokumentation erwähnt:
Ab Version 2.10 können Sie jedoch Namespaces verwenden:
{% 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 %}
quelle
namespace(foo=false)
ist der Kleinbuchstabe f in False eine jinja2-Umgangssprache oder meinten Sie False, wie Python es für boolesche Werte erfordert?The special constants true, false, and none are indeed lowercase. Because that caused confusion in the past, (True used to expand to an undefined variable that was considered false), all three can now also be written in title case (True, False, and None). However, for consistency, (all Jinja identifiers are lowercase) you should use the lowercase versions.
"Sie können dies tun, um den Vorlagencode zu bereinigen
{% 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 %}
Und im Servercode verwenden
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)
Dies könnte auf Folgendes verallgemeinert werden
{{ 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 %}
Und im Servercode verwenden
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)
quelle