web-dev-qa-db-fra.com

Construire une liste dans les modèles Django

Avec ce code:

{% for o in [1,2,3] %}
    <div class="{% cycle 'row1' 'row2' %}">
        {% cycle 'row1' 'row2' %}
    </div>
{% endfor %}

Je reçois un TemplateSyntaxError:

Could not parse the remainder: '[1,2,3]' from '[1,2,3]'

Est-il possible de construire une liste dans un modèle?

32
zjm1126

Vous pouvez le faire en utilisant judicieusement le filtre make_list , mais c'est probablement une mauvaise idée:

{% for o in "123"|make_list %}
    <div class="{% cycle 'row1' 'row2' %}">
        {% cycle 'row1' 'row2' %}
    </div>
{% endfor %}

p.s. Vous ne semblez pas utiliser o nulle part, je ne suis donc pas sûr de ce que vous essayez de faire.

25
Dominic Rodger

Nous pouvons utiliser la méthode split sur un objet str:

page.html:

{% with '1 2 3' as list %}
  {% for i in list.split %}
    {{ i }}<br>
  {% endfor %}
{% endwith %}

Résultats :

1
2
3
49
Zulu

Les autres réponses ici ressemblent au billet (du moins pour ce que je voulais), alors je vais vous dire pourquoi vous voudrez peut-être faire quelque chose comme ça (et il y a peut-être une meilleure réponse pour mon cas que celle qui a été fournie) :

Je suis tombé sur cette question en cherchant un moyen de créer 3 boutons très similaires, mais pas identiques, à l’aide de Bootstrap. Un bouton pourrait ressembler à

<div class="btn-group">
  <a class="btn btn-primary dropdown-toggle" data-toggle="dropdown" href="#">
    Modality
    <span class="caret"></span>
  </a>
  <ul class="dropdown-menu" id="Modality">
    <li><a href="#">Action</a></li>
  </ul>
</div>

où la différence entre les boutons est limitée au texte du bouton (Modality, sur sa propre ligne ci-dessus) et au contenu du bouton, que nous supposerons rempli dynamiquement par JS (referenceencing id = "Modality") .

Si je dois en faire 10, copier/coller du code HTML me paraît stupide et fastidieux, surtout si je veux changer quoi que ce soit à propos de mon bouton après coup (par exemple, en les séparant toutes en deux) et cela va à l'encontre de DRY.

Donc, au lieu de cela, dans le modèle, je pourrais faire quelque chose comme 

{% with 'Modality Otherbutton Thirdbutton' as list %}
  {% for i in list.split %}
    <!-- copy/paste above code with Modality replaced by {{ i }} -->
  {% endfor %}
{% endwith %}

Maintenant, d'accord, dans ce cas particulier, les boutons ajoutent des fonctionnalités à une grille de données associée, de sorte que les noms des boutons puissent également être remplis de manière dynamique à partir de données Django provenant de modèles, mais je n'en suis pas encore à ce stade de ma conception vous pouvez voir où ce type de fonctionnalité est souhaitable pour maintenir DRY.

10
Alex Whittemore

C'est probablement un peu trop tard maintenant. J'ai fait cette balise de modèle pour atteindre cet objectif.

from Django import template
register = template.Library()

# you might want to use simple_tag if you are on 1.9 or higher version
@register.assignment_tag
def to_list(*args):
    return args

pour l'utiliser dans le template:

{% load your_template_tag_file %}
{% to_list 1 2 3 4 5 "yes" as my_list %}
{% for i in my_list %}
    {{ i }}
{% endfor %}

Référence ici: Balises d’affectation Django

8
rabbit.aaron

Le plus simple est de faire 

{% for x in "123" %}
6
Jonathan Liuti

drodger est correct, vous ne pouvez pas faire cela dans le langage de modèle Django délibérément paralysé. Passez la liste en tant que variable de contexte lorsque vous appelez le modèle ou essayez une balise de modèle telle que expr . Ensuite, vous pouvez dire {% expr [1,2,3] as my_list %} puis utiliser my_list dans votre boucle for.

2
Peter Rowell

C'est peut-être une inspiration. Utilisez le filtre intégré add.

{{ first|add:second }}

first is [1, 2, 3] and second is [4, 5, 6], then the output will be [1, 2, 3, 4, 5, 6].

This filter will first try to coerce both values to integers. 
If this fails, it'll attempt to add the values together anyway. 
This will work on some data types (strings, list, etc.) and fail on others. 
If it fails, the result will be an empty string.

Les spécifications officielles, https://docs.djangoproject.com/zh-hans/2.0/ref/templates/builtins/#built-in-filter-reference

0
W.Perrin