web-dev-qa-db-fra.com

Fractionner la chaîne en liste dans Jinja?

J'ai un certain nombre de variables dans un modèle jinja2 qui sont des chaînes séparées par un ';'.

Je dois utiliser ces chaînes séparément dans le code. c'est-à-dire que la variable est variable1 = "green; blue"

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

Je peux les séparer avant de rendre le modèle, mais comme il contient parfois jusqu'à 10 chaînes dans la chaîne, cela devient compliqué.

J'ai eu un jsp avant où je l'ai fait:

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

MODIFIER:

Cela fonctionne avec:

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

Cela fonctionne avec:

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

S'il y a jusqu'à 10 chaînes, vous devriez utiliser une liste pour parcourir toutes les valeurs.

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

Vous ne pouvez pas exécuter de code Python arbitraire dans jinja; cela ne fonctionne pas comme JSP à cet égard (il a juste l’air similaire). Toutes les choses dans jinja sont une syntaxe personnalisée.

Pour ce faire, il serait plus judicieux de définir un filtre personnalisé , afin que vous puissiez par exemple procéder comme suit:

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 fonction de filtrage pourrait alors ressembler à ceci:

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

Une autre solution, qui pourrait avoir encore plus de sens, serait de la scinder dans le contrôleur et de transmettre la liste scindée à la vue.

8
poke