Вопрос по django-templates, django – Числовой для цикла в шаблонах Django

204

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

for i = 1 to n

Ваш Ответ

16   ответов
341

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

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

я думаю, самый хороший. Я храню 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 %}
Я немного изменил это (извините форматирование):try: return range(number) except: return [], Таким образом, он никогда не вызывает ошибку и возвращает пустой массив (аналогично тому, как работает большинство шаблонных функций).
Также создайте пустой файл _init _.py в каталоге templatetags. Также добавьте эти строки в начало my_filters.pyfrom django.template import Library;register = Library()
Добавьте второй параметр фильтра, и вы получите функцию полного диапазона, встроенную в python.@register.filter(name='range') def filter_range(start, end): return range(start, end) Потом привыкаешь как{% for i in 1|range:6 %}{% endfor %}, Смотрите полный ответ ниже ....
Я думаю, что это правильное решение. Делатьrange(1, 16) чтобы получить числа, начиная с 1, а не 0.
9

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

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

You can pass :

{ 'n' : range(n) }

To use template :

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

9

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

90
{% with ''|center:n as range %}
{% for _ in range %}
    {{ forloop.counter }}
{% endfor %}
{% endwith %}
Спасибо, все еще работает ... 6 лет спустя :)
Отличный ответ! Не нужно было создавать новый фильтр.
Не нужно ничего делать на виду. Отличный хак
Отличный ответ. Работает, потому что центр создает строку из n пробелов, которые затем зацикливаются. Каждый символ пробела тогда игнорируется, но текущее значение в диапазоне можно найти в forloop.counter (или forloop.counter0). Увидетьdocs.djangoproject.com/en/dev/ref/templates/builtins/#center
-1

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

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

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>
2

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.

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

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

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

Это расширение ответа @ guillermo-siliceo-trueba.
4

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

Можете ли вы привести пример / объяснение того, как это работает?
30

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

{'n' : range(n) }

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

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

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

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

использованиеrange(n) в Python 3, если я правильно помню, xrange был объявлен устаревшим
Определенно да. И это была одна из двух строк кода, с которой мне пришлось столкнуться при переходе приложения на Python3.
6

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

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

views.py:

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

HTML:

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

ломтик& 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>
Не уверен, что это именно то, что искал ОП, но это именно то, что я искал. знак равно
92

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

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

и в шаблоне:

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

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

Похожие вопросы