String in Jinja in Liste teilen?

73

Ich habe einige Variablen in einer jinja2-Vorlage, die Zeichenfolgen sind, die durch ein ';' getrennt sind.

Ich muss diese Zeichenfolgen separat im Code verwenden. dh die Variable ist variable1 = "grün; blau"

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

Ich kann sie vor dem Rendern der Vorlage aufteilen, aber da es manchmal bis zu 10 Zeichenfolgen innerhalb der Zeichenfolge gibt, wird dies chaotisch.

Ich hatte vorher einen JSP, wo ich tat:

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

BEARBEITEN:

Es funktioniert mit:

{% set list1 = variable1.split(';') %}
The grass is {{ list1[0] }} and the boat is {{ list1[1] }}
user3605780
quelle
Können Sie die Zeichenfolge teilen, bevor Sie sie an die Vorlage senden?
KylieCatt
@ IanAuld ja, ich kann, aber wie gesagt, es wird chaotisch, weil es viele Strings sind und alle eine Menge Strings enthalten.
user3605780
1
Sie können Ihren eigenen Filter schreiben, um einen Split für einen beliebigen Charakter durchzuführen. Siehe stackoverflow.com/questions/20678004/…
junnytony

Antworten:

121

Nachdem ich nach 5 Jahren auf meine eigene Frage zurückgekommen war und so viele Leute gesehen hatte, fand ich dies nützlich, ein kleines Update.

Eine String-Variable kann listmithilfe der Split-Funktion in a aufgeteilt werden (sie kann ähnliche Werte enthalten, setist für die Zuweisung vorgesehen ). Ich habe diese Funktion in der offiziellen Dokumentation nicht gefunden, aber sie funktioniert ähnlich wie normales Python. Die Elemente können über einen Index aufgerufen, in einer Schleife verwendet oder wie von Dave vorgeschlagen, wenn Sie die Werte kennen, Variablen wie ein Tupel festlegen.

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

oder

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

oder

{% set item1, item2 = variable1.split(';') %}
The grass is {{ item1 }} and the boat is {{ item2 }}
user3605780
quelle
10
Jinja2 wird auch ala einen erweiterten Tupelstil zuweisen {% set list1,list2 = variable1.split(';') %}.
Dave
Ist das eine Liste oder ein Set? Denn im Set folgt es den Eigenschaften des Sets und nicht der Liste.
as2d3
1
@AbhishekAgrawal Der Wert, der an die Vorlage übergeben wird, ist eine durch Semikolons getrennte Zeichenfolge.
user3605780
Ja, aber wir haben list1 erstellt. Ob es sich dann um eine Liste oder um eine Menge handelt?
as2d3
@AbhishekAgrawal Ich denke, die Split-Funktion erstellt eine Liste. Die 'Menge' stammt aus dem Einstellen einer Variablen, die kein Datensatz ist. Ich bin mir aber nicht sicher, ob es sich um eine Liste oder einen Satz handelt, aber Sie können einfach mit {{list1 [0]}} zu Ihren Daten gelangen.
user3605780
16

Wenn bis zu 10 Zeichenfolgen vorhanden sind, sollten Sie eine Liste verwenden, um alle Werte zu durchlaufen.

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

Sie können in jinja keinen beliebigen Python-Code ausführen. In dieser Hinsicht funktioniert es nicht wie JSP (es sieht einfach ähnlich aus). Alle Dinge in Jinja sind benutzerdefinierte Syntax.

Für Ihren Zweck ist es am sinnvollsten, einen benutzerdefinierten Filter zu definieren , damit Sie beispielsweise Folgendes tun können:

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

Die Filterfunktion könnte dann so aussehen:

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

Eine Alternative, die noch sinnvoller sein könnte, wäre, sie im Controller aufzuteilen und die geteilte Liste an die Ansicht zu übergeben.

Sack
quelle
2
Wo lege ich die Filterfunktion hin?
Willem van Ketwich
@WillemvanKetwich Haben Sie die Dokumentation zu benutzerdefinierten Filtern gelesen, die ich in meiner Antwort verlinkt habe?
Poke
3
Ich habe es getan - und deshalb habe ich gefragt. Ich verwende dies im Kontext von Ansible und habe daher eine relevantere Antwort gefunden. groups.google.com/forum/#!topic/ansible-project/A7fGX-7X-ks trotzdem danke. :)
Willem van Ketwich