Antworten:
Ich habe eine einfache Technik verwendet, die für kleine Fälle ohne spezielle Tags und ohne zusätzlichen Kontext gut funktioniert. Manchmal ist das praktisch
{% for i in '0123456789'|make_list %}
{{ forloop.counter }}
{% endfor %}
{% for i in "x"|rjust:"100" %}
{% with ''|center:n as range %}
{% for _ in range %}
{{ forloop.counter }}
{% endfor %}
{% endwith %}
Leider wird dies in der Django-Vorlagensprache nicht unterstützt . Es gibt ein paar von Anregungen , aber sie scheinen ein wenig komplexer. Ich würde nur eine Variable in den Kontext setzen:
...
render_to_response('foo.html', {..., 'range': range(10), ...}, ...)
...
und in der Vorlage:
{% for i in range %}
...
{% endfor %}
Meine Meinung zu diesem Thema finde ich am schönsten. Ich behalte eine 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 %}
<li>Item</li>
{% endfor %}
range(1, 16)
Zahlen von 1 beginnen zu bekommen, nicht 0.
from django.template import Library;register = Library()
@register.filter(name='range') def filter_range(start, end): return range(start, end)
Dann wird als verwendet {% for i in 1|range:6 %}{% endfor %}
. Siehe die vollständige Antwort unten ....
try: return range(number) except: return []
. Auf diese Weise wird niemals ein Fehler ausgelöst und ein leeres Array zurückgegeben (ähnlich wie bei den meisten Vorlagenfunktionen).
Vielleicht so?
{% for i in "x"|rjust:"100" %}
...
{% endfor %}
Sie können eine Bindung von übergeben
{'n' : range(n) }
zur Vorlage, dann tun
{% for i in n %}
...
{% endfor %}
Beachten Sie, dass Sie ein 0-basiertes Verhalten erhalten (0, 1, ... n-1).
(Aus Gründen der Python3-Kompatibilität aktualisiert)
range(n)
in Python 3, wenn ich mich richtig erinnere, war xrange darauf veraltet
Sie übergeben sich nicht n
selbst, sondern range(n)
[die Liste der Ganzzahlen von 0 bis n-1 eingeschlossen] aus Ihrer Sicht in Ihre Vorlage, und in letzterer tun Sie dies {% for i in therange %}
(wenn Sie absolut auf 1-basierten statt auf der normalen 0 bestehen -basierter Index, den Sie forloop.counter
im Körper der Schleife verwenden können ;-).
Nur für den Fall, dass jemand anderes auf diese Frage stößt ... Ich habe ein Vorlagen-Tag erstellt, mit dem Sie Folgendes erstellen können range(...)
: http://www.djangosnippets.org/snippets/1926/
Akzeptiert dieselben Argumente wie der integrierte 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 some_range%} {{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
Ich habe mich sehr um diese Frage bemüht und finde hier die beste Antwort: (von wie man 7-mal in den Django-Vorlagen schleift )
Sie können sogar auf die IDX zugreifen!
views.py:
context['loop_times'] = range(1, 8)
html:
{% for i in loop_times %}
<option value={{ i }}>{{ i }}</option>
{% endfor %}
Du kannst passieren :
{'n': Bereich (n)}
So verwenden Sie die Vorlage:
{% für i in n%} ... {% endfor%}
Sie sollten " Slice " in der Vorlage verwenden, ein Beispiel wie das folgende:
in views.py
contexts = {
'ALL_STORES': Store.objects.all(),
}
return render_to_response('store_list.html', contexts, RequestContext(request, processors=[custom_processor]))
in store_list.html:
<ul>
{% for store in ALL_STORES|slice:":10" %}
<li class="store_item">{{ store.name }}</li>
{% endfor %}
</ul>
Dieses Verfahren unterstützt alle Funktionen der range([start,] stop[, step])
Standardfunktion
<app>/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)
Verwendungszweck:
{% load range %}
<p>stop 5
{% for value in 5|range %}
{{ value }}
{% endfor %}
</p>
<p>start 5 stop 10
{% for value in 5|range:10 %}
{{ value }}
{% endfor %}
</p>
<p>start 5 stop 10 step 2
{% for value in 5|range:"10,2" %}
{{ value }}
{% endfor %}
</p>
Ausgabe
<p>stop 5
0 1 2 3 4
</p>
<p>start 5 stop 10
5 6 7 8 9
</p>
<p>start 5 stop 10 step 2
5 7 9
</p>
for value in 0|range:"10,2"
. Sie müssen Ihren Code wie folgt ändern:args = filter(lambda x: isinstance(x, int) and x >= 0, (_min, _max, _step))
Ich gehe die beliebte Antwort nur ein bisschen weiter und mache sie robuster. Auf diese Weise können Sie einen beliebigen Startpunkt angeben, z. B. 0 oder 1. Es verwendet auch die Python-Bereichsfunktion, bei der das Ende eins weniger ist, sodass 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 Ihre Vorlage einfach die obige Vorlagen-Tag-Datei ein und verwenden Sie Folgendes:
{% for c in 1|range:6 %}
{{ c }}
{% endfor %}
Jetzt können Sie 1-6 statt nur 0-6 oder hartes Codieren ausführen. Das Hinzufügen eines Schritts würde ein Vorlagen-Tag erfordern. Dies sollte mehr Anwendungsfälle abdecken, sodass es ein Fortschritt ist.
Dies erfordert im Wesentlichen eine range
Funktion. Hierfür wurde ein Django-Feature-Ticket ( https://code.djangoproject.com/ticket/13088 ) erstellt, das jedoch mit dem folgenden Kommentar als "nicht behoben" geschlossen wurde.
Mein Eindruck von dieser Idee ist, dass sie versucht, zur Programmierung in der Vorlage zu führen. Wenn Sie eine Liste von Optionen haben, die gerendert werden müssen, sollten diese in der Ansicht und nicht in der Vorlage berechnet werden. Wenn das so einfach ist wie ein Wertebereich, dann soll es so sein.
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.
Für diejenigen, die nach einer einfachen Antwort suchen und nur eine Anzahl von Werten anzeigen müssen, sagen wir 3 von 100 Posts, zum Beispiel fügen Sie {% for post in posts|slice:"3" %}
sie einfach hinzu und wiederholen Sie sie normal, und es werden nur 3 Posts hinzugefügt.
Wenn die Nummer von einem Modell stammt, fand ich, dass dies ein schöner Patch für das Modell ist:
def iterableQuantity(self):
return range(self.quantity)
{% for i in range(10) %}
{{ i }}
{% endfor %}