Как мне написать числовой for
цикл в шаблоне Django? Я имею в виду что-то вроде
for i = 1 to n
Как мне написать числовой for
цикл в шаблоне Django? Я имею в виду что-то вроде
for i = 1 to n
Я использовал простую технику, которая хорошо работает для небольших случаев без специальных тегов и дополнительного контекста. Иногда это пригодится
{% for i in '0123456789'|make_list %}
{{ forloop.counter }}
{% endfor %}
context={'iterateover': range(x)}
тоже подойдет
- person Izkata; 04.09.2013
{% for i in "x"|rjust:"100" %}
- person Aaron; 30.03.2016
К сожалению, это не поддерживается языком шаблонов Django. Есть пара из предложения, но они кажутся немного сложными. Я бы просто поместил переменную в контекст:
...
render_to_response('foo.html', {..., 'range': range(10), ...}, ...)
...
и в шаблоне:
{% for i in range %}
...
{% endfor %}
clear_full_page_cache()
в шаблоне (видно в магазине php / magento, на отладку ушло много времени). Наконец, не очень разумно позволять серверу отображать это, когда на стороне клиента это можно сделать так же просто и дешевле, учитывая, что с ним не связаны никакие данные (иначе вы просто повторяете данные).
- person Melvyn; 24.03.2021
Я считаю, что мой подход к этому вопросу самый питонический. Создайте my_filters.py
в каталоге templatetags
приложений.
@register.filter(name='times')
def times(number):
return range(number)
Использование в вашем шаблоне:
{% load my_filters %}
{% for i in 15|times %}
<li>Item</li>
{% endfor %}
range(1, 16)
, чтобы получить числа, начинающиеся с 1, а не с 0.
- person chhantyal; 16.02.2015
from django.template import Library;register = Library()
- person Ajeeb.K.P; 23.03.2015
@register.filter(name='range') def filter_range(start, end): return range(start, end)
Затем используется как {% for i in 1|range:6 %}{% endfor %}
. См. Полный ответ ниже ....
- person Paul Kenjora; 05.09.2016
try: return range(number) except: return []
. Таким образом, он никогда не вызывает ошибку и не возвращает пустой массив (аналогично тому, как работает большинство шаблонных функций).
- person Tim Tisdall; 28.09.2017
Вы можете передать привязку
{'n' : range(n) }
к шаблону, затем выполните
{% for i in n %}
...
{% endfor %}
Обратите внимание, что вы получите поведение на основе 0 (0, 1, ... n-1).
(Обновлено для совместимости с Python3)
range(n)
в python 3, если я правильно помню, xrange на нем устарел
- person Felício; 11.04.2016
Может вот так?
{% for i in "x"|rjust:"100" %}
...
{% endfor %}
Вы можете пройти:
{'n': диапазон (n)}
Чтобы использовать шаблон:
{% для i в n%} ... {% endfor%}
Вы не передаете сам n
, а скорее range(n)
[список целых чисел от 0 до n-1 включен] из вашего представления в ваш шаблон, а в последнем вы передаете {% for i in therange %}
(если вы абсолютно настаиваете на использовании 1, а не нормальный индекс, отсчитываемый от 0, вы можете использовать forloop.counter
в теле цикла ;-).
Я очень старался ответить на этот вопрос и нашел здесь лучший ответ: (from как выполнить 7 циклов в шаблонах django)
Вы даже можете получить доступ к idx!
views.py:
context['loop_times'] = range(1, 8)
html:
{% for i in loop_times %}
<option value={{ i }}>{{ i }}</option>
{% endfor %}
На всякий случай, если кто-нибудь еще столкнется с этим вопросом ... Я создал тег шаблона, который позволяет вам создавать range(...)
: http://www.djangosnippets.org/snippets/1926/
Accepts the same arguments as the 'range' builtin and creates a list containing the result of 'range'. Syntax: {% mkrange [start,] stop[, step] as context_name %} For example: {% mkrange 5 10 2 as some_range %} {% for i in some_range %} {{ i }}: Something I want to repeat\n {% endfor %} Produces: 5: Something I want to repeat 7: Something I want to repeat 9: Something I want to repeat
Этот метод поддерживает все функциональные возможности стандартной функции range([start,] stop[, step])
.
<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)
Использование:
{% 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>
Выход
<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"
. Вы должны изменить свой код следующим образом: args = filter(lambda x: isinstance(x, int) and x >= 0, (_min, _max, _step))
- person Bedilbek; 28.02.2020
Я просто немного углублю популярный ответ и сделаю его более надежным. Это позволяет указать любую начальную точку, например 0 или 1. Он также использует функцию диапазона Python, где конец на единицу меньше, поэтому его можно использовать напрямую, например, с длинами списков.
@register.filter(name='range')
def filter_range(start, end):
return range(start, end)
Затем в свой шаблон просто включите указанный выше файл тега шаблона и используйте следующее:
{% for c in 1|range:6 %}
{{ c }}
{% endfor %}
Теперь вы можете сделать 1-6 вместо 0-6 или жесткого кодирования. Для добавления шага потребуется тег шаблона, он должен охватывать больше вариантов использования, так что это шаг вперед.
Вы должны использовать "slice" в шаблоне, например это:
в views.py
contexts = {
'ALL_STORES': Store.objects.all(),
}
return render_to_response('store_list.html', contexts, RequestContext(request, processors=[custom_processor]))
в store_list.html:
<ul>
{% for store in ALL_STORES|slice:":10" %}
<li class="store_item">{{ store.name }}</li>
{% endfor %}
</ul>
По сути, для этого требуется range
функция. Был поднят запрос функции Django (https://code.djangoproject.com/ticket/13088) для этого, но закрыто как "не будет исправлено" со следующим комментарием.
У меня сложилось впечатление, что эта идея ведет к программированию в шаблоне. Если у вас есть список параметров, которые необходимо отобразить, их следует вычислять в представлении, а не в шаблоне. Если это так же просто, как диапазон значений, пусть будет так.
У них есть хороший момент - шаблоны должны быть очень простыми представлениями. Вы должны создать ограниченные требуемые данные в представлении и перейти к шаблону в контексте.
Если число исходит от модели, я обнаружил, что это хороший патч для модели:
def iterableQuantity(self):
return range(self.quantity)
Вы можете использовать: {% with ''|center: i as range %}
Для тех, кто ищет простой ответ, просто нужно отобразить количество значений, скажем, 3 из 100 сообщений, например, просто добавьте {% for post in posts|slice:"3" %}
и зациклите его в обычном режиме, и будут добавлены только 3 сообщения.
Это показывает от 1 до 20 чисел:
{% for i in "x"|rjust:"20"|make_list %}
{{ forloop.counter }}
{% endfor %}
также это может вам помочь: (count_all_slider_objects поступают из представлений)
{% for i in "x"|rjust:count_all_slider_objects %}
{{ forloop.counter }}
{% endfor %}
or
{% with counter=count_all_slider_objects %}
{% if list_all_slider_objects %}
{% for slide in list_all_slider_objects %}
{{forloop.counter|add:"-1"}}
{% endfor%}
{% endif %}
{% endwith %}