Числовой для цикла в шаблонах Django

Как мне написать числовойfor цикл в шаблоне Django? Я имею в виду что-то вроде

for i = 1 to n

Ответы на вопрос(16)

You can pass :

{ 'n' : range(n) }

To use template :

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

n сам, а точнееrange(n) [список целых чисел от 0 до n-1 включен], от вашего взгляда до вашего шаблона, и в последнем вы делаете{% for i in therange %} (если вы абсолютно настаиваете на 1, а не на обычном 0, вы можете использоватьforloop.counter в теле цикла ;-).

Я создал тег шаблона, который позволяет вам создавать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

 17 авг. 2012 г., 17:29
-1 в пользу фрагмента Alex Pi, который добавляет поддержку переменных аргументов.

я думаю, самый хороший. Я храню 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 %}
 05 сент. 2016 г., 09:13
Добавьте второй параметр фильтра, и вы получите функцию полного диапазона, встроенную в python.@register.filter(name='range') def filter_range(start, end): return range(start, end) Потом привыкаешь как{% for i in 1|range:6 %}{% endfor %}, Смотрите полный ответ ниже ....
 28 сент. 2017 г., 18:14
Я немного изменил это (извините форматирование):try: return range(number) except: return [], Таким образом, он никогда не вызывает ошибку и возвращает пустой массив (аналогично тому, как работает большинство шаблонных функций).
 23 мар. 2015 г., 06:42
Также создайте пустой файл _init _.py в каталоге templatetags. Также добавьте эти строки в начало my_filters.pyfrom django.template import Library;register = Library()
 16 февр. 2015 г., 11:30
Я думаю, что это правильное решение. Делатьrange(1, 16) чтобы получить числа, начиная с 1, а не 0.
{% with ''|center:n as range %}
{% for _ in range %}
    {{ forloop.counter }}
{% endfor %}
{% endwith %}
 14 нояб. 2016 г., 18:53
Отличный ответ! Не нужно было создавать новый фильтр.
 01 мар. 2018 г., 10:44
Не нужно ничего делать на виду. Отличный хак
 17 февр. 2019 г., 10:33
Спасибо, все еще работает ... 6 лет спустя :)
 22 мая 2016 г., 18:50
Отличный ответ. Работает, потому что центр создает строку из n пробелов, которые затем зацикливаются. Каждый символ пробела тогда игнорируется, но текущее значение в диапазоне можно найти в forloop.counter (или forloop.counter0). Увидетьdocs.djangoproject.com/en/dev/ref/templates/builtins/#center

range функция. Билет на Django был поднят (https://code.djangoproject.com/ticket/13088) для этого, но закрыто, поскольку "не будет исправлено" со следующим комментарием.

My impression of this idea is that it is trying to lead to programming in the template. If you have a list of options that need to be rendered, they should be computed in the view, not in the template. If that's as simple as a range of values, then so be it.

У них есть хорошая точка зрения - шаблоны должны быть очень простыми представлениями представления. Вы должны создать ограниченные необходимые данные в представлении и перейти к шаблону в контексте.

 17 мая 2017 г., 07:40
Представление должно быть для данных, шаблон должен быть для представления. Представление не должно требовать знания содержимого шаблона, в частности диапазонов. Причина, по которой Django игнорирует эти запросы, - полная чушь.

я обнаружил, что это хороший патч для модели:

def iterableQuantity(self):
    return range(self.quantity)
 18 мая 2017 г., 22:18
Я даже не знаю & # x2026;
 17 мая 2017 г., 07:42
Не уверен, почему вы проголосовали, это верный ответ. Мне не нравится это решение по сравнению с реализацией надлежащего фильтра, как описано выше. Модели БД должны быть сухими. Но это все же лучше, чем ответ, принятый большинством.

ломтик& Quot; в шаблоне пример как это:

в 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>
 21 мар. 2014 г., 18:49
Не уверен, что это именно то, что искал ОП, но это именно то, что я искал. знак равно

не поддерживается на языке шаблонов Django. Естьпара  изпредложения, но они кажутся немного сложными. Я бы просто поместил переменную в контекст:

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

и в шаблоне:

{% for i in range %}
     ...
{% endfor %}
 11 февр. 2016 г., 17:40
Мотивы, с помощью которых авторы Django запретили использование простого питона в шаблонах, кажутся бессмысленными и несущественными по сравнению с болью и потерей времени, затрачиваемыми на то, чтобы обойтись без него, не говоря уже о необходимости изобретать совершенно новый язык, когда он совершенно потрясающий (питон! ) уже прямо там!
 11 февр. 2016 г., 22:02
@ Богатырь Если это то, что вы хотите, просто используйте Jinja2:docs.djangoproject.com/en/1.9/topics/templates/…

которая хорошо работает для небольших случаев без специальных тегов и без дополнительного контекста. Иногда это пригодится

{% for i in i|rjust:20 %}
    {{ forloop.counter }}
{% endfor %}
 30 мар. 2016 г., 21:48
Создайте строку произвольной длины с помощью «rjust»{% for i in "x"|rjust:"100" %}
 11 июл. 2012 г., 21:10
FWIW, 012 == 12, поэтому он будет только зацикливаться на 1 и 2.
 18 авг. 2012 г., 04:44
{% для i в «0123456789» | make_list%} для итерации по всем 10, не пропуская 0.
 06 сент. 2016 г., 06:43
В третий раз этот ответ ЕСТЬBAD, НЕ используйте это. Используйте тег шаблона и делайте это правильно. Я не вижу, как сказать, что ответ плохой, является достаточной причиной, чтобы удалить комментарий.
 14 мар. 2017 г., 21:33
@ Rebs Что такого плохого в этом? Конечно, это нехорошо, но добавление тега шаблона только потому, что вам нужно зацикливаться на небольшом диапазоне один раз в проекте, также не является таким хорошим решением.

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>

зволяет вам указать любую начальную точку, например, 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 или жестко кодировать его. Добавление шага потребует тег шаблона, это должно охватывать больше случаев использования, так что это шаг вперед.

 05 сент. 2016 г., 09:22
Это расширение ответа @ guillermo-siliceo-trueba.

Вы можете передать обязательное

{'n' : range(n) }

к шаблону, затем сделайте

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

Обратите внимание, что вы получите поведение на основе 0 (0, 1, ... n-1).

(Обновлено для совместимости с Python3)

 13 апр. 2016 г., 02:45
Определенно да. И это была одна из двух строк кода, с которой мне пришлось столкнуться при переходе приложения на Python3.
 11 апр. 2016 г., 15:20
использованиеrange(n) в Python 3, если я правильно помню, xrange был объявлен устаревшим

как зациклить 7 раз в шаблонах Django)

Вы даже можете получить доступ к idx!

views.py:

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

HTML:

{% for i in loop_times %}
        <option value={{ i }}>{{ i }}</option>
{% endfor %}

{% with ''|center: i as range %}

 17 мая 2017 г., 07:42
Можете ли вы привести пример / объяснение того, как это работает?

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

Ваш ответ на вопрос