2014-11-20 8 views

Odpowiedz

22

Jak mówi Albo Duan, Jinja2 ma swój własny język. Wygląda jak Python, ale to nie Python. Zatem wbudowana funkcja Python enumerate nie jest częścią silnika szablonów Jinja2. Istnieją jednak pewne alternatywy można użyć:

Jeśli chcesz wymienić elementy na liście można użyć loop.index0 pętli specjalnej zmiennej:

>>> from jinja2 import Template 

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

Inną opcją jest precalculate z wymienionych wersji lista:

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

a także jeszcze jeden, może być nawet przechodząc enumerate jako zmienna tOO:

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

Kolba umożliwia automatyczne wprowadzanie zmiennych do kontekstu szablonu za pomocą Context Processors. Więc jeśli chcesz enumerate wbudowaną funkcję mają być dostępne dla wszystkich szablonów, może to być miły rozwiązanie:

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

Dzięki Sean Vieira do tej sugestii.

+1

Jeszcze jedną opcją jest zarejestrowanie procesora kontekstowego i udostępnienie w Pythonie tego, co chcesz, w środowisku Jinja. Ładna lista, by the. –

+0

@SeanVieira Ładne rozwiązanie. Dodałem tę opcję do listy. Mam nadzieję, że to, co miałeś na myśli. – dreyescat

3

Flask używać Jinja2 do renderowania szablonu, Jinja2 mają podobną składnię Pythona, ale to nie jest python.

Co możesz zrobić? W kodzie Pythona:

my_dict = enumerate(some_list) 

Następnie podczas renderowania szablonu wysłać dict do niego:

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