Jinja: {% set %} weist var dem globalen Kontext nicht zu

Erstellt am 22. Nov. 2012  ·  4Kommentare  ·  Quelle: pallets/jinja

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.

Hilfreichster Kommentar

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

Alle 4 Kommentare

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

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

priestc picture priestc  ·  5Kommentare

harobed picture harobed  ·  6Kommentare

mitsuhiko picture mitsuhiko  ·  3Kommentare

jp-costa picture jp-costa  ·  5Kommentare

humiaozuzu picture humiaozuzu  ·  3Kommentare