2013-07-29 28 views
6
{% set disabled = '' %} 
{% for voter in record.voters %} 
    {% if user == voter %} 
     {% set disabled = 'disabled' %} 
    {% endif %} 
    {{ disabled }} # outputs: 'disabled' 
{% endfor %} 
{{ disabled }} # outputs: '' 

Ho quel modello in Jinja2. Quello che mi serve è la variabile 'disabled' per essere visibile all'esterno 'per' ciclo. È possibile?Jinja2: variabile locale/globale

risposta

10

Il modo più semplice per gestire questo è quello di spostare la logica che imposta la variabile disabled nella funzione di visualizzazione e la invia al modello pronto per essere utilizzato. Combinare la logica dell'applicazione con la presentazione non è una buona idea, i modelli dovrebbero ricevere i dati quanto più digeriti possibile.

Detto questo, c'è un brutto trucco che rende ciò che desideri, mostrato nella risposta accettata allo this question.

La soluzione consiste nell'abilitare l'estensione do per Jinja2 e utilizzarla per modificare un array globale. Per abilitare l'uso di estensione:

app.jinja_env.add_extension('jinja2.ext.do') 

Ecco la soluzione adatta al vostro esempio:

{% set disabled = [] %} 
{% for voter in record.voters %} 
    {% if user == voter %} 
     {% do disabled.append(1) %} 
    {% endif %} 
{% endfor %} 
{% if disabled %} 
    disabled 
{% endif %} 
+0

thx . Ho già revisionato il mio codice e ho fatto come mi hai suggerito all'inizio. –

0

da blocchi predefiniti non possono accedere alle variabili da ambiti esterni, è possibile escludere questo utilizzando il modificatore scoped in questo modo:

{% for item in list scoped %} 
{% endfor %} 

See: http://jinja.pocoo.org/docs/templates/#block-nesting-and-scope

+1

Questo non l'ha fatto! 'Scoped' funziona per i blocchi non per i loop –

+0

@ c00p3r.web in tal caso suggerisco di aprire un problema per jinja2 in quanto sembra una funzionalità che sarebbe desiderata: https://github.com/mitsuhiko/jinja2/issues –

6

È possibile utilizzare una matrice/dict come suggerisce Miguel, ma non è necessario l'estensione fare per sé ; puoi impostare una var fittizia. Io uso il seguente:

{% set glob={} %} 

in alto, e poi nel mio codice:

{% set _ = glob.update({'disabled':True}) %} 

Le variabili _ è solo un manichino, non si utilizza in seguito.

0

Mi rendo conto che sto rispondendo a un thread precedente. Tuttavia, ho iniziato a utilizzare Jinja recentemente e ho riscontrato un problema simile: avevo bisogno di contare la quantità di righe stampate in cicli nidificati. La mia soluzione stava avvolgendo una variabile contatore in una classe e passando un'istanza al modello. Allo stesso modo, è possibile utilizzare una classe wrapper, in questo modo

class VoterStatus(object): 
    def __init__(self, status='active'): 
     self._status = status 

    def set_disabled(self): 
     self._status = 'disabled' 

    def __str__(self): 
     return self._status 

modificare il modello di conseguenza

{% for voter in record.voters %} 
    {% if user == voter %} 
     {% status.set_disabled() %} 
    {% endif %} 
    {{ status }} # outputs: 'disabled' 
{% endfor %} 

passare un'istanza di classe di stato per il modello per il rendering:

tmplt.render(status=VoterStatus(), ...) 

... e Bob è tuo zio.