Numerisch für Schleife in Django-Vorlagen

Wie schreibe ich eine numerische for Schleife in einer Django-Vorlage? Ich meine sowas

 for i = 1 to n 

    Ich habe eine einfache Technik verwendet, die für kleine Fälle ohne spezielle Tags und ohne zusätzlichen Kontext funktioniert. Manchmal ist das praktisch

     {% for i in "xxxxxxxxxxxxxxxxxxxx" %} {{ forloop.counter0 }} {% endfor %} 

    Passen Sie die Länge von “xxxxxxxxxxxxxxxxxxxx” an Ihre Bedürfnisse an. “xxx” um nur 3 Iterationen zu machen usw.

    Leider wird das in der Django-Vorlagensprache nicht unterstützt . Es gibt ein paar Vorschläge , aber sie scheinen ein wenig komplex zu sein. Ich würde einfach eine Variable in den Kontext stellen:

     ... render_to_response('foo.html', {..., 'range': range(10), ...}, ...) ... 

    und in der Vorlage:

     {% for i in range %} ... {% endfor %} 
     {% with ''|center:n as range %} {% for _ in range %} {{ forloop.counter }} {% endfor %} {% endwith %} 

    Meine Meinung zu diesem Thema ist meiner Meinung nach am schönsten. Ich halte ein my_filters.py im Templatetags-Verzeichnis.

     @register.filter(name='times') def times(number): return range(number) 

    Und Sie würden so verwenden:

     {% load my_filters %} {% for i in 15|times %} 
  • Item
  • {% endfor %}

    Vielleicht so?

     {% for i in "x"|rjust:"100" %} ... {% endfor %} 

    Sie können eine Bindung von übergeben

     {'n' : range(n) } 

    zu der Vorlage, dann tun

     {% for i in n %} ... {% endfor %} 

    Beachten Sie, dass Sie ein 0-basiertes Verhalten erhalten (0, 1, … n-1).

    (Aktualisiert für Python3-Kompatibilität)

    Du übergibst n selbst, sondern range(n) [die Liste der ganzen Zahlen von 0 bis n-1 eingeschlossen], aus deiner Sicht zu deiner Vorlage, und in letzterem tust du {% for i in therange %} Wenn Sie unbedingt auf 1-basiert statt auf dem normalen 0-basierten Index bestehen, können Sie forloop.counter im Körper der Schleife verwenden forloop.counter .

    Nur wenn jemand anders auf diese Frage stößt … Ich habe ein Template-Tag erstellt, mit dem Sie eine range(...) erstellen range(...) : http://www.djangosnippets.org/snippets/1926/

     Akzeptiert dieselben Argumente wie der eingebaute 'Bereich' und erstellt eine Liste mit
     das Ergebnis von 'Reichweite'.
    
     Syntax:
         {% mkrange [start,] stop [, step] als Kontextname%}
    
     Beispielsweise:
         {% mkrange 5 10 2 als Some_range%}
         {% für i in einem Bereich%}
           {{i}}: Etwas, das ich wiederholen möchte \ n
         {% endfor%}
    
     Produziert:
         5: Etwas, das ich wiederholen möchte 
         7: Etwas, das ich wiederholen möchte 
         9: Etwas, das ich wiederholen möchte
    
    

    Sie sollten ” slice ” in der Vorlage verwenden, ein Beispiel wie folgt:

    in ansichten.py

     contexts = { 'ALL_STORES': Store.objects.all(), } return render_to_response('store_list.html', contexts, RequestContext(request, processors=[custom_processor])) 

    in store_list.html:

     
      {% for store in ALL_STORES|slice:":10" %}
    • {{ store.name }}
    • {% endfor %}

    Diese Methode unterstützt alle functionen der Standardfunktion range([start,] stop[, step])

    /templatetags/range.py

     from django import template register = template.Library() @register.filter(name='range') def _range(_min, args=None): _max, _step = None, None if args: if not isinstance(args, int): _max, _step = map(int, args.split(',')) else: _max = args args = filter(None, (_min, _max, _step)) return range(*args) 

    Verwendung:

     {% load range %} 

    stop 5 {% for value in 5|range %} {{ value }} {% endfor %}

    start 5 stop 10 {% for value in 5|range:10 %} {{ value }} {% endfor %}

    start 5 stop 10 step 2 {% for value in 5|range:"10,2" %} {{ value }} {% endfor %}

    Ausgabe

     

    stop 5 0 1 2 3 4

    start 5 stop 10 5 6 7 8 9

    start 5 stop 10 step 2 5 7 9

    Ich habe mich sehr intensiv mit dieser Frage beschäftigt und finde hier die beste Antwort: ( wie man 7x in den Django Templates loopt )

    Sie können sogar auf die IDX zugreifen!

    ansichten.py:

     context['loop_times'] = range(1, 8) 

    html:

     {% for i in loop_times %}  {% endfor %} 

    Ich nehme die beliebte Antwort nur ein bisschen weiter und mache sie robuster. Damit können Sie einen beliebigen Startpunkt angeben, z. B. 0 oder 1. Es verwendet auch die python-Bereichsfunktion, bei der das Ende um eins kleiner ist, so dass es beispielsweise direkt mit Listenlängen verwendet werden kann.

     @register.filter(name='range') def filter_range(start, end): return range(start, end) 

    Fügen Sie dann in Ihrer Vorlage einfach die obige Template-Tag-Datei ein und verwenden Sie Folgendes:

     {% for c in 1|range:6 %} {{ c }} {% endfor %} 

    Jetzt können Sie 1-6 anstatt nur 0-6 oder hart codieren. Das Hinzufügen eines Schritts würde ein Schablonen-Tag erfordern, das mehr Anwendungsfälle abdecken sollte, so dass es ein Schritt vorwärts ist.

    Sie können Folgendes verwenden: {% with ''|center: i as range %}

    Dies erfordert im Wesentlichen eine range . Ein Django-Feature-Ticket wurde dafür ausgetriggers ( https://code.djangoproject.com/ticket/13088 ), aber als “wird nicht repariert” mit dem folgenden Kommentar geschlossen.

    Mein Eindruck von dieser Idee ist, dass sie versucht, zur Programmierung in der Vorlage zu führen. Wenn Sie eine Liste mit Optionen haben, die gerendert werden müssen, sollten sie in der Ansicht und nicht in der Vorlage berechnet werden. Wenn das so einfach ist wie eine Reihe von Werten, dann sei es so.

    Sie haben einen guten Punkt – Vorlagen sollen sehr einfache Darstellungen der Ansicht sein. Sie sollten die begrenzten erforderlichen Daten in der Ansicht erstellen und im Kontext an die Vorlage übergeben.

    Sie können durch :

    {‘n’: Bereich (n)}

    Vorlage verwenden:

    {% für i in n%} … {% endfor%}

    Wenn die Nummer von einem Modell kommt, fand ich, dass dies ein schöner Patch für das Modell ist:

     def iterableQuantity(self): return range(self.quantity)