2015-05-28 17 views
30

Ho alcune variabili in un modello jinja2 le cui stringhe sono separate da un ';'.Dividi la stringa nella lista in jinja?

Ho bisogno di utilizzare queste stringhe separatamente nel codice. cioè la variabile è variabile1 = "verde; blu"

{% list1 = {{ variable1 }}.split(';') %} 
The grass is {{ list1[0] }} and the boat is {{ list1[1] }} 

io posso dividere prima del rendering del modello, ma dal momento che sono a volte fino a 10 stringhe all'interno della stringa di questo diventa disordinato.

ho avuto un jsp prima dove ho fatto:

<% String[] list1 = val.get("variable1").split(";");%>  
The grass is <%= list1[0] %> and the boat is <%= list1[1] %> 

EDIT:

Funziona con:

{% set list1 = variable1.split(';') %} 
The grass is {{ list1[0] }} and the boat is {{ list1[1] }} 
+0

CAa dividi la stringa prima di inviarla al modello? – IanAuld

+0

@IanAuld sì, ma come ho detto è complicato perché sono un sacco di stringhe e contengono tutte un sacco di stringhe al loro interno. – user3605780

+0

Si potrebbe scrivere il proprio filtro per fare una divisione su qualsiasi personaggio che ti piace. Vedi http://stackoverflow.com/questions/20678004/jinja2-split-string-by-white-spaces – junnytony

risposta

55

Funziona con:

{% set list1 = variable1.split(';') %} 
The grass is {{ list1[0] }} and the boat is {{ list1[1] }} 
+6

Jinja2 assegnerà anche ala di stile a tupla estesa '{% set list1, list2 = variable1.split (';')%}'. – Dave

+0

È un elenco o un set? Perché nel set, seguirà le proprietà dell'insieme e non l'elenco. –

+1

@AbhishekAgrawal il valore passato al modello è una stringa separata da punto e virgola. – user3605780

5

Non è possibile eseguire codice Python arbitrario a Jinja; in questo senso non funziona come JSP (sembra solo simile). Tutte le cose in jinja sono sintassi personalizzata.

per il vostro scopo, avrebbe più senso per definire un custom filter, così si potrebbe ad esempio fare quanto segue:

The grass is {{ variable1 | splitpart(0, ',') }} and the boat is {{ splitpart(1, ',') }} 
Or just: 
The grass is {{ variable1 | splitpart(0) }} and the boat is {{ splitpart(1) }} 

La funzione di filtro potrebbe quindi simile a questa:

def splitpart (value, index, char = ','): 
    return value.split(char)[index] 

Un'alternativa, che potrebbe avere ancora più senso, sarebbe dividerla nel controller e passare la lista divisa alla vista.

+0

Dove inserisco la funzione filtro? –

+0

@WillemvanKetwich Hai letto la documentazione sui filtri personalizzati che ho collegato nella mia risposta? – poke

+0

Ho fatto - ed è per questo che ho chiesto. Sto usando questo nel contesto di Ansible e quindi ho trovato una risposta più rilevante. https://groups.google.com/forum/#!topic/ansible-project/A7fGX-7X-ks ringrazia comunque. :) –

7

Se ci sono fino a 10 stringhe allora si dovrebbe utilizzare una lista in ordine per scorrere tutti i valori.

{% set list1 = variable1.split(';') %} 
{% for list in list1 %} 
<p>{{ list }}</p> 
{% endfor %} 
Problemi correlati