2015-05-28 9 views
30

Mam niektóre zmienne w szablonie jinja2, które są ciągi rozdzielone przez ";".Podziel ciąg na listę w jinja?

Muszę używać tych ciągów oddzielnie w kodzie. tj zmienna jest variable1 = „green, blue”

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

mogę podzielić je przed renderowania szablon, ale ponieważ są czasami nawet do 10 strun wewnątrz łańcucha to robi bałagan.

miałem JSP przed gdzie robiłam:

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

EDIT:

Współpracuje z:

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

Podzielić łańcuch przed wysłaniem go do szablonu? – IanAuld

+0

@IanAuld Tak, ale mogę, ale jak powiedziałem, że jest brudny, ponieważ jest wiele ciągów i wszystkie zawierają wiele ciągów w nich. – user3605780

+0

Możesz napisać własny filtr, aby podzielić się dowolną postacią. Zobacz http://stackoverflow.com/questions/20678004/jinja2-split-string-by-white-spaces – junnytony

Odpowiedz

55

Współpracuje z:

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

Jinja2 będzie również przypisywać rozszerzone-tuple ala '{% set list1, list2 = variable1.split (';')%}'. – Dave

+0

Czy to jest lista czy zestaw? Ponieważ w zestawie będzie podążał za właściwościami zestawu, a nie listy. –

+1

@AbhishekAgrawal wartość, która jest przekazywana do szablonu jest średnikiem oddzielone ciąg. – user3605780

5

Nie można uruchomić dowolny kod Pythona w Jinja; w tym przypadku nie działa tak jak JSP (wygląda po prostu podobnie). Wszystkie rzeczy w jinja mają niestandardową składnię.

Dla celów, czy miałoby to największy sens, aby zdefiniować custom filter, więc można na przykład wykonać następujące czynności:

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) }} 

Funkcja filtr mógłby wyglądać następująco:

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

Alternatywą, która może mieć jeszcze większy sens, byłoby podzielenie go na kontroler i przekazanie podzielonej listy do widoku.

+0

Gdzie umieścić funkcję filtra? –

+0

@WillemvanKetwich Czy przeczytałeś dokumentację dotyczącą filtrów niestandardowych, które zostały połączone w mojej odpowiedzi? – poke

+0

Zrobiłem - i dlatego poprosiłem. Używam tego w kontekście Ansible, więc znaleźliśmy bardziej trafną odpowiedź. https://groups.google.com/forum/#!topic/ansible-project/A7fGX-7X- thanks thanks anyway. :) –

7

Jeśli istnieją do 10 strun należy użyć listy w celu iterację wszystkich wartości.

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