web-dev-qa-db-de.com

So lösen Sie die for-Schleife in der Django-Vorlage

Ich habe diesen Code

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

Ich möchte die for-Schleife nach der ersten Iteration durchbrechen. Pause funktioniert nicht 

31
tej.tan

Es gibt kein break im Django-Vorlagensystem. Das Django-Vorlagensystem wird nicht mit python programmiert, sondern mit seiner eigenen Sprache .

Abhängig davon, was Sie tun müssen, können Sie diese Frage nützlich finden. Andernfalls legen Sie einfach das one-Konto, das Sie unter HTML drucken möchten, in ein spezielles Feld in Ihrem RequestContext.

16

Ich denke, Sie sollten Slice verwenden, um Ihr Ziel zu erreichen

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

Sie können die break-Anweisung nicht verwenden. Sie können sie jedoch nicht in HTML drucken. Es ist keine beste Lösung, aber Sie können es verwenden. Ich benutze den folgenden;

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

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

Es scheint im Grunde so auf dem Browser zu sein . http://i.stack.imgur.com/MPbR3.jpg

2
Brkyrn

Ich habe einen Weg gefunden, dies mit einer Bedingung zu tun. Es ist hässlich und hackig, aber es funktioniert (für mich). first ist das, was das OP wollte, aber dies beantwortet die eigentliche Frage genauer.

In Anbetracht dessen:

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

Ich wollte wissen, ob mein obj irgendwelche kinder mit besitz hat, die spielzeug sind.

Folgendes habe ich getan:

Python-Äquivalent:

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

Django-Vorlage:

Mein Ansatz bestand darin, regroup zu verwenden, um Gruppen von Kandidaten zu erstellen, die die Kriterien nicht erfüllen oder nicht erfüllen:

{% 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 erstellt ein neues Objekt, das im Wesentlichen Folgendes ist:

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

Der length_is:"0" stellt sicher, dass wir höchstens drei Elemente in dieser Liste haben und die grouper entweder True oder False oder '' ist. Dann durchlaufen wir die Liste und suchen nach einem False-Wert.

  • Wenn keine Kinder vorhanden sind, wäre dies eine leere Liste und die Variable if würde niemals getroffen.
  • Wenn keine Kinder Spielzeug haben, wäre dies eine Liste ohne Falsegrouper.
  • Wenn alle Kinder Spielzeug haben, wäre dies eine Liste mit einer Falsegrouper.
  • Wenn einige Kinder Spielzeug haben, wäre dies eine Liste mit False und Truegroupers.
1
Hounshell

In diesem Fall können Sie prüfen, ob forloop.counter == 1 oder forloop.first ist, und das erste Element einfach ausdrucken.

  {% 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

Sie können Ihr Django-Vorlagensystem für Schleife in Javascript für Schleife als innere Schleife verwenden.

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