Числовой для цикла в шаблонах Django - PullRequest
220 голосов
/ 10 июля 2009

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

for i = 1 to n

Ответы [ 16 ]

356 голосов
/ 22 апреля 2011

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

{% for i in i|rjust:20 %}
    {{ forloop.counter }}
{% endfor %}
95 голосов
/ 10 июля 2009

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

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

и в шаблоне:

{% for i in range %}
     ...
{% endfor %}
91 голосов
/ 18 января 2013
{% with ''|center:n as range %}
{% for _ in range %}
    {{ forloop.counter }}
{% endfor %}
{% endwith %}
70 голосов
/ 09 октября 2012

Мой взгляд на этот вопрос, я думаю, самый хороший. Я храню 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 %}
35 голосов
/ 16 мая 2013

Может, вот так?

{% for i in "x"|rjust:"100" %}
...
{% endfor %}
30 голосов
/ 10 июля 2009

Вы можете передать привязку

{'n' : range(n) }

к шаблону, затем выполните

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

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

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

9 голосов
/ 15 февраля 2010

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

9 голосов
/ 10 июля 2009

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

6 голосов
/ 07 июля 2016

Я очень старался в этом вопросе, и я нашел лучший ответ здесь: (из как зацикливаться 7 раз в шаблонах django )

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

views.py:

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

HTML:

{% for i in loop_times %}
        <option value={{ i }}>{{ i }}</option>
{% endfor %}
6 голосов
/ 23 февраля 2016

Этот метод поддерживает все функции стандартной 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...