Vorlage:
{% set foo = "bar" %}
foo - {{ foo }}
{% for i in range(2) %}
for:foo - {{ foo }}
{% set foo = i %}
for:foo - {{ foo }}
{% endfor %}
{{ foo }}
{% block test %}
block:foo - {{ foo }}
{% set foo = "baz" %}
block:foo - {{ foo }}
{% endblock %}
foo - {{ foo }}
Ergebnis:
foo - bar
for:foo - bar
for:foo - 0
for:foo - 0
for:foo - 1
foo - bar
block:foo - bar
block:foo - baz
foo - bar
wtf?
Bitte erstellen Sie eine Methode zum Zuweisen einer globalen Variablen.
Chipping mit einigen weiteren Details. So sieht der obige Code aus, um ein Gefühl dafür zu bekommen, was im Inneren passiert:
from jinja2.runtime import LoopContext, TemplateReference, Macro, Markup, TemplateRuntimeError, missing, concat, escape, markup_join, unicode_join, to_string, identity, TemplateNotFound
name = None
def root(context, environment=environment):
...
l_foo = 'bar'
context.vars['foo'] = l_foo
context.exported_vars.add('foo')
yield u'\nfoo - %s\n\n' % (
l_foo,
)
t_1 = l_foo
l_i = missing
for l_i in context.call(l_range, 2):
if 0: yield None
yield u'\n for:foo - %s\n ' % (
l_foo,
)
l_foo = l_i
yield u'\n for:foo - %s\n ' % (
l_foo,
)
l_foo = t_1
l_i = missing
yield u'\n\n'
for event in context.blocks['test'][0](context):
yield event
yield u'\n\nfoo - '
yield to_string(l_foo)
def block_test(context, environment=environment):
l_foo = context.resolve('foo')
if 0: yield None
yield u'\n block:foo - %s\n ' % (
l_foo,
)
l_foo = 'baz'
yield u'\n block:foo - %s\n' % (
l_foo,
)
blocks = {'test': block_test}
debug_info = '2=8&3=12&5=16&6=19&7=21&8=23&11=28&17=31&11=33&12=37&13=39&14=41'
Mehr Details:
Globale: http://jinja.pocoo.org/docs/api/#global -namespace
Allgemein: http://jinja.pocoo.org/docs/templates/#assignments
Implementierung: http://jinja.pocoo.org/docs/api/#jinja2.runtime.Context
Eine weitere gute Erklärung: http://stackoverflow.com/a/3355029/482864
Irgendwelche Ideen?
Dies ist dokumentiertes Verhalten.
mitsuhiko,
Wir haben das gleiche Problem wie DriverX.
Ja, die Verwendung von "set" ist dokumentiert, aber funktioniert es?
Unser Beispiel:
{% set the_var = 'foo' %} {% für e in Elementen %} {% set the_var = 'YES' %} die var: {{ die_var }} {%- endfor %} die_var: {{ die_var}}
Ergebnis:
the_var: JA the_var: JA the_var: foo
Kannst du uns helfen? Vielen Dank
http://stackoverflow.com/questions/4870346/can-a-jinja-variables-scope-extend-beyond-in-an-inner-block und http://stackoverflow.com/questions/9486393/jinja2-change- der-wert-einer-variablen-in-einer-schleife
Ich verstehe wirklich nicht, warum diese Hacks notwendig sind, sollten "local var" -Syntax oder ähnliches sein
Grüße
Hilfreichster Kommentar
mitsuhiko,
Wir haben das gleiche Problem wie DriverX.
Ja, die Verwendung von "set" ist dokumentiert, aber funktioniert es?
Unser Beispiel:
Ergebnis:
Kannst du uns helfen? Vielen Dank