2016-11-15 3 views
3

Ich habe eine globale Funktion testJinja2 Frame-Variablen in der globalen Funktion

from jinja2.utils import contextfunction 

@contextfunction 
def test(context): 
    context.get_all() 

Und in meinem Test ich es so nennen ...

{% set i = 0 %} 
{% for j in range(0, 10) %} 
    {% set k = 0 %} 
    {{ test() }} 
{% endfor %} 

Die einzige Variable, die am Ende in die context in test ist i. j und k sind "unlesbar". Gibt es einen Weg, um sie anderen den Zugriff auf als sie in test(j, k)

+0

werden Sie mit Rahmen in der Vorlage zu importieren? (zB: {% von 'admin/lib.html' import render_form, render_field, render_form_fields mit Kontext%}) – rll

+0

Aus diesem Beispiel gibt es keinen Import. 'render' wird auf der kompilierten Vorlage aufgerufen und' test() 'wird zu' env ['globals'] ' – Shaun

+0

hinzugefügt. Sie müssen j, k an die Funktion übergeben. Diese Variablen sind lokal für den for-Block und nicht für den globalen Kontext verfügbar. j ist selbsterklärend; k ist lokal, weil ['{% set%}' nicht dem globalen Kontext zugewiesen wird (https://github.com/pallets/jinja/issues/164). – approxiblue

Antwort

2

Nach einer github issue with a similar concern vorbei, die Variablen, die Sie definiert haben als j und k gesetzt lokal und nicht global. Die Funktion, die Sie aufrufen möchten, erkennt die Variable k nur, wenn Sie sie an die Funktion übergeben. Dies ist dokumentiertes Verhalten.

Verwandte Stackoverflow Fragen:

Can a Jinja variable's scope extend beyond in an inner block?

Jinja2: Change the value of a variable inside a loop

+1

Das war meine Schlussfolgerung. Gut, einen Plausibilitätscheck zu haben. Es scheint seltsam, dass Sie nicht auf den lokalen Block zugreifen können. – Shaun

Verwandte Themen