2012-08-14 16 views
12

Per quanto posso vedere, non c'è modo di verificare se un oggetto è un'istanza List in Jinja2. In primo luogo, è corretto e in secondo luogo, qualcuno ha implementato un test/estensione personalizzato in Jinja2? Qualsiasi aiuto sarebbe grande.Test per un elenco in Jinja2

risposta

9

Si può facilmente fare questo con un filtro personalizzato in jinja2.

Prima si crea metodo di prova:

def is_list(value): 
    return isinstance(value, list) 

e aggiungerlo come un filtro personalizzato:

j = jinja2.Jinja2(app) 
j.environment.filters.update({ 
     'is_list': is_list, 
}) 
0

Jinja ha molti test builtin. Probabilmente stai cercando iterable.

{% if var is iterable %} 
+5

Una stringa è anche iterabile, quindi non funziona – pors

+0

Ho notato anche il test 'sequence' ma considera anche una stringa una sequenza. –

18

ho fatto come questo {% if var is iterable and var is not string %}

+1

nel mio caso '{% se var is string%}' ha funzionato perfettamente; grazie. – berto

-1

Nella mia messa a punto, mi piacerebbe per un valore ad essere o una stringa o lista di stringhe che entrano nel modello di Jinja. Quindi quello che mi importava di più non era la stringa vs la lista, ma il singolo elemento rispetto a più oggetti. Questa risposta potrebbe essere utile se il tuo caso d'uso è simile.

Poiché non esiste un test integrato per "è l'elenco?" che rifiuta anche le stringhe, ho preso in prestito un modello dal design dell'API e ho avvolto i singoli oggetti in una lista sul lato Python, quindi ho controllato la lunghezza dell'elenco sul lato Jinja.

Python:

context = { ... } 

# ex. value = 'a', or ['a', 'b'] 
if not isinstance(value, list): 
    value = [value] 

context['foo'] = value 

Jinja:

{% if foo|length == 1 %} 
    single-item list 
{% elif foo|length > 1 %} 
    multi-item list 
{% endif %} 

E se tutto quello che volete fare è aggiungere un separatore di oggetto per la visualizzazione, è possibile saltare la verifica lunghezza esplicita e solo {{ value|join(', ') }}.

+0

Sembra che questa risposta abbia ricevuto un downvote per qualche motivo. Funziona bene per me, ma sentiti libero di aggiungere un commento se qualcosa non funziona per te. –