web-dev-qa-db-fra.com

Comment casser "for loop" dans le template Django

J'ai ce code

    {% for account in object_list %}
        <tr>
        {% for field, value in book.get_fields %}
              <th>{{ field.verbose_name }}</th> 
        {% endfor %}
        </tr>
    {{ break }}
    {% endfor %}

Je veux casser la boucle après la première itération. la pause ne fonctionne pas 

31
tej.tan

Il n'y a pas break dans le système de templates Django. Le système de templates Django n'est pas programmé avec python mais avec sa propre langue .

Selon ce que vous devez faire, vous pourriez trouver cette question utile. Sinon, placez simplement le compte un et le seul que vous essayez d'imprimer sur HTML sur un champ spécial de votre RequestContext.

16
Pablo Santa Cruz

Je pense que vous devriez utiliser slice pour atteindre votre objectif

{% for account in object_list|slice:":1" %}
88
Turikumwe

Vous ne pouvez pas utiliser l'instruction break, mais vous pouvez choisir de ne pas les imprimer en HTML. Ce n'est pas la meilleure solution mais vous pouvez l'utiliser. J'utilise le suivant;

{%for tumbnail in image %}
         {%if tumbnail.object_id == element.id %}
          <img src="/media/{{ tumbnail.image }}" class="tr_all_hover"alt="">

{{ "<!--" }}
  {%endif%} 
{%endfor%}     
{{ "-->" }}

Cela ressemble fondamentalement à ceci sur le navigateur . http://i.stack.imgur.com/MPbR3.jpg

2
Brkyrn

J'ai trouvé un moyen de faire cela avec une condition. C'est moche et hacky, mais ça marche (pour moi). first est ce que le PO voulait, mais cela répond plus précisément à la question.

Compte tenu de ceci:

obj = {
  'children': [
    { 'possessions' : { 'toys': [] } },
    { 'possessions' : { 'toys': ['train'] } }
    { 'possessions' : { 'toys': ['train', 'ball'] } }
  ]
}

Je voulais savoir si mon obj a des enfants avec des biens qui sont des jouets.

Voici ce que j'ai fait:

Équivalent Python:

if ([child for child in obj.children if child.possessions.toys]):
  # Whatever

Modèle Django:

Mon approche consistait à utiliser regroup pour créer des ensembles de candidats qui correspondaient ou non aux critères:

{% regroup obj.children by possessions.toys|length_is:"0" as by_toys %}
{% for check in by_toys %}{% if check.grouper == False %}
  Whatever
{% endif %}{% endfor %}

regroup construit un nouvel objet qui est essentiellement:

[
  { 'grouper': '', 'list': [/*...*/] },
  { 'grouper': True, 'list': [/*...*/] },
  { 'grouper': False, 'list': [/*...*/] }
]

Le length_is:"0" s'assure que nous avons au plus trois éléments dans cette liste et que la grouper est soit True ou False ou ''. Ensuite, nous parcourons la liste et recherchons une valeur False.

  • S'il n'y a pas d'enfants, la liste sera vide et la variable if ne sera jamais touchée.
  • Si aucun enfant n'a de jouets, ce serait une liste sans Falsegrouper.
  • Si tous les enfants ont des jouets, ce sera une liste avec Falsegrouper.
  • Si certains enfants ont des jouets, ce sera une liste avec False et Truegroupers.
1
Hounshell

Dans ce cas, vous pouvez vérifier si forloop.counter == 1 ou si forloop.first et simplement imprimer ce premier élément.

  {% for account in object_list %}
      {% if forloop.first %}
        <tr>
        {% for field, value in book.get_fields %}
              <th>{{ field.verbose_name }}</th> 
        {% endfor %}
        </tr>
      {% endif %}
    {% endfor %}
0
somecallitblues

Vous pouvez utiliser votre système de gabarits Django pour une boucle en javascript pour une boucle en tant que boucle intérieure et vous pouvez utiliser une rupture comme suit: -

for(var i=0;i<1;i++){
        {% for owner in Owner %}
            id  = "{{owner.id}}";
            if(id == pk1){
                f="{{owner.flat}}";
                break;
            }             
        {% endfor %}
     }
0
Rohit Shekhar