Jinja: {% set %} tidak menetapkan var ke konteks global

Dibuat pada 22 Nov 2012  ·  4Komentar  ·  Sumber: pallets/jinja

templat:

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

hasil:

foo - bar
    for:foo - bar
    for:foo - 0
    for:foo - 0
    for:foo - 1
foo - bar
    block:foo - bar
    block:foo - baz
foo - bar

apa?

Harap buat metode untuk menetapkan variabel global.

Komentar yang paling membantu

mitsuhiko,

Kami memiliki masalah yang sama dengan DriverX.
Ya, penggunaan "set" didokumentasikan, tetapi, apakah itu berfungsi?

Contoh kami:

 {% set the_var = 'foo' %}
 {% untuk e dalam elemen %}
 {% set the_var = 'YA' %} 
 var: {{ the_var }}
 {%- akhir untuk %}
 the_var: {{ the_var }}

Hasil:

 the_var: YA
 the_var: YA
 the_var: foo

Bisakah Anda membantu kami? Terima kasih

Semua 4 komentar

Memotong dengan beberapa detail lebih lanjut. Seperti inilah tampilan kode di atas untuk mengetahui apa yang terjadi di dalam:

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'

Keterangan lebih lanjut:
Global: http://jinja.pocoo.org/docs/api/#global -namespace
Umum: http://jinja.pocoo.org/docs/templates/#assignments
Implementasi: http://jinja.pocoo.org/docs/api/#jinja2.runtime.Context
Penjelasan bagus lainnya: http://stackoverflow.com/a/3355029/482864

Ada ide?

Ini adalah perilaku yang didokumentasikan.

mitsuhiko,

Kami memiliki masalah yang sama dengan DriverX.
Ya, penggunaan "set" didokumentasikan, tetapi, apakah itu berfungsi?

Contoh kami:

 {% set the_var = 'foo' %}
 {% untuk e dalam elemen %}
 {% set the_var = 'YA' %} 
 var: {{ the_var }}
 {%- akhir untuk %}
 the_var: {{ the_var }}

Hasil:

 the_var: YA
 the_var: YA
 the_var: foo

Bisakah Anda membantu kami? Terima kasih

Apakah halaman ini membantu?
0 / 5 - 0 peringkat