Jak napisać for
pętlę numeryczną w szablonie Django? Mam na myśli coś takiego
for i = 1 to n
Jak napisać for
pętlę numeryczną w szablonie Django? Mam na myśli coś takiego
for i = 1 to n
Użyłem prostej techniki, która działa dobrze w małych skrzyniach bez specjalnych znaczników i bez dodatkowego kontekstu. Czasami jest to przydatne
{% for i in '0123456789'|make_list %}
{{ forloop.counter }}
{% endfor %}
{% for i in "x"|rjust:"100" %}
źródło
Niestety nie jest to obsługiwane w języku szablonów Django. Istnieje kilka z propozycji , ale wydaje się trochę skomplikowane. Po prostu umieściłbym zmienną w kontekście:
i w szablonie:
źródło
Uważam, że jest to najlepsze. Trzymam my_filters.py w katalogu templatetags.
I użyłbyś takiego:
źródło
range(1, 16)
uzyskać liczby zaczynające się od 1, a nie od 0from django.template import Library;register = Library()
@register.filter(name='range') def filter_range(start, end): return range(start, end)
Następnie przyzwyczaja się jako{% for i in 1|range:6 %}{% endfor %}
. Zobacz pełną odpowiedź poniżej ...try: return range(number) except: return []
. W ten sposób nigdy nie zgłasza błędu i zwraca pustą tablicę (podobnie jak działa większość funkcji szablonu).Może tak?
źródło
Możesz przekazać powiązanie
do szablonu, a następnie zrób
Zauważ, że otrzymasz zachowanie oparte na 0 (0, 1, ... n-1).
(Zaktualizowano dla kompatybilności z Python3)
źródło
range(n)
w pythonie 3, jeśli dobrze pamiętam, xrange był na nim przestarzałyNie przekazujesz
n
się, ale raczejrange(n)
[dołączona lista liczb całkowitych od 0 do n-1], z twojego widoku do szablonu, a w tym drugim robisz{% for i in therange %}
(jeśli absolutnie nalegasz na 1 zamiast zwykłego 0 oparty na indeksie, którego można użyćforloop.counter
w ciele pętli ;-).źródło
Wystarczy, że ktokolwiek napotka to pytanie… Stworzyłem tag szablonu, który pozwala ci stworzyć
range(...)
: http://www.djangosnippets.org/snippets/1926/źródło
Bardzo się starałem na to pytanie i znajduję najlepszą odpowiedź tutaj: (od tego, jak zapętlić 7 razy w szablonach django )
Możesz nawet uzyskać dostęp do idx!
views.py:
HTML:
źródło
Możesz przekazać:
{'n': zakres (n)}
Aby użyć szablonu:
{% for i in n%} ... {% endfor%}
źródło
W szablonie należy użyć „ plasterka ”, na przykład:
w views.py
w store_list.html:
źródło
Metoda ta obsługuje wszystkie funkcje standardowej
range([start,] stop[, step])
funkcji<app>/templatetags/range.py
Stosowanie:
Wynik
źródło
for value in 0|range:"10,2"
. Musisz zmienić kod w następujący sposób:args = filter(lambda x: isinstance(x, int) and x >= 0, (_min, _max, _step))
Po prostu posuwam popularną odpowiedź nieco dalej i robię ją bardziej niezawodną. Umożliwia to określenie dowolnego punktu początkowego, na przykład 0 lub 1. Używa także funkcji zakresu Pythona, gdzie koniec jest o jeden mniejszy, więc można go użyć bezpośrednio na przykład z długością listy.
Następnie w swoim szablonie po prostu dołącz powyższy plik znacznika szablonu i użyj następujących poleceń:
Teraz możesz zrobić 1-6 zamiast tylko 0-6 lub kodować na stałe. Dodanie kroku wymagałoby tagu szablonu, który powinien obejmować więcej przypadków użycia, więc jest to krok naprzód.
źródło
Zasadniczo wymaga to
range
funkcji. Zgłoszono bilet funkcji Django ( https://code.djangoproject.com/ticket/13088 ), ale zamknięto go jako „nie można naprawić” następującym komentarzem.Mają dobrą rację - szablony mają być bardzo prostymi reprezentacjami widoku. Należy utworzyć ograniczone wymagane dane w widoku i przekazać szablon w kontekście.
źródło
Możesz użyć:
{% with ''|center: i as range %}
źródło
Dla tych, którzy szukają prostej odpowiedzi, tylko wyświetlającej liczbę wartości, powiedzmy, że na przykład 3 ze 100 postów po prostu dodają
{% for post in posts|slice:"3" %}
i zapętlają ją normalnie, a zostaną dodane tylko 3 posty.źródło
Jeśli numer pochodzi z modelu, uważam, że jest to przyjemna łatka do modelu:
źródło
źródło