2014-11-20 10 views

risposta

22

Come dice o Duan, Jinja2 ha un suo linguaggio. Sembra Python ma non è Python. Quindi la funzione built-in Python enumerate non fa parte del motore di template Jinja2. Vi sono, tuttavia, alcune alternative è possibile utilizzare:

Se si desidera enumerare gli elementi di una lista è possibile utilizzare il loop.index0 ciclo variabile speciale:

>>> from jinja2 import Template 

>>> t1 = """ 
... {% for val in ['a', 'b', 'c'] %} 
...  <td> 
...   {{ loop.index0 }} {{ val }} 
...  </td> 
... {% endfor %} 
... """ 
>>> Template(t1).render() 

Un'altra opzione è quella di precalculate la versione enumerato di la lista:

>>> t2 = """ 
... {% for i, val in l %} 
...  <td> 
...   {{ i }} {{ val }} 
...  </td> 
... {% endfor %} 
... """ 
>>> Template(t2).render(l=enumerate(['a', 'b', 'c'])) 

Ed anche un altro, potrebbe essere anche passando enumerate come una variabile troppo:

>>> t3 = """ 
... {% for i, val in enumerate(['a', 'b', 'c']) %} 
...  <td> 
...   {{ i }} {{ val }} 
...  </td> 
... {% endfor %} 
... """ 
>>> Template(t3).render(enumerate=enumerate) 

Flask consente l'iniezione automatica di variabili nel contesto di un modello tramite Context Processors. Quindi, se volete enumerate funzione built-in per essere disponibili per tutti i modelli, questa potrebbe essere una bella soluzione:

@app.context_processor 
def inject_enumerate(): 
    return dict(enumerate=enumerate) 

Grazie a Sean Vieira per questo suggerimento.

+1

Un'altra opzione è registrare un processore di contesto ed esporre ciò che si desidera da Python all'interno dell'ambiente Jinja. Bella lista, a cura di. –

+0

@SeanVieira Bella soluzione. Ho aggiunto questa opzione alla lista. Spero sia quello che volevi dire. – dreyescat

3

Flask usa Jinja2 per rendere il tuo modello, Jinja2 ha una sintassi python simile ma non è python.

Cosa si può fare? Nel codice Python:

my_dict = enumerate(some_list) 

Poi, quando il rendering del modello di inviare il dict ad esso:

render_template('page.html', my_dict=my_dict)