Ответы:
Я использовал простую технику, которая хорошо работает для небольших случаев без специальных тегов и дополнительного контекста. Иногда это пригодится
{% for i in '0123456789'|make_list %}
{{ forloop.counter }}
{% endfor %}
{% for i in "x"|rjust:"100" %}
{% with ''|center:n as range %}
{% for _ in range %}
{{ forloop.counter }}
{% endfor %}
{% endwith %}
К сожалению, это не поддерживается в языке шаблонов Django. Есть целый пар из предложений , но они , кажется , немного сложнее. Я бы просто поместил переменную в контекст:
...
render_to_response('foo.html', {..., 'range': range(10), ...}, ...)
...
и в шаблоне:
{% for i in range %}
...
{% endfor %}
Мой взгляд на этот вопрос, я думаю, самый хороший. Я храню 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.
from django.template import Library;register = Library()
@register.filter(name='range') def filter_range(start, end): return range(start, end)
Потом привыкаешь {% for i in 1|range:6 %}{% endfor %}
. Смотрите полный ответ ниже ....
try: return range(number) except: return []
. Таким образом, он никогда не вызывает ошибку и возвращает пустой массив (аналогично тому, как работает большинство шаблонных функций).
Может быть так?
{% for i in "x"|rjust:"100" %}
...
{% endfor %}
Вы можете передать обязательство
{'n' : range(n) }
к шаблону, затем сделайте
{% for i in n %}
...
{% endfor %}
Обратите внимание, что вы получите поведение на основе 0 (0, 1, ... n-1).
(Обновлено для совместимости с Python3)
range(n)
в Python 3, если я правильно помню, xrange был объявлен устаревшим
Вы сами не передаете n
, а вместо этого range(n)
[список целых чисел от 0 до n-1 включается], от вашего взгляда к вашему шаблону, и в последнем вы делаете {% for i in therange %}
(если вы абсолютно настаиваете на 1, а не на нормальном 0 индекс на основе вы можете использовать forloop.counter
в теле цикла ;-).
Просто, если кто-то еще сталкивается с этим вопросом ... Я создал тег шаблона, который позволяет вам создать range(...)
: http://www.djangosnippets.org/snippets/1926/
Принимает те же аргументы, что и встроенный диапазон, и создает список, содержащий результат «диапазона». Синтаксис: {% mkrange [start,] stop [, step] как context_name%} Например: {% mkrange 5 10 2 as some_range%} {% для меня в some_range%} {{i}}: то, что я хочу повторить \ n {% endfor%} Производит: 5: что-то, что я хочу повторить 7: что-то, что я хочу повторить 9: что-то, что я хочу повторить
Я очень старался в этом вопросе, и я нахожу лучший ответ здесь: (из того, как выполнить цикл 7 раз в шаблонах django )
Вы даже можете получить доступ к idx!
views.py:
context['loop_times'] = range(1, 8)
HTML:
{% for i in loop_times %}
<option value={{ i }}>{{ i }}</option>
{% endfor %}
Вы можете пройти:
{'n': range (n)}
Чтобы использовать шаблон:
{% для i в n%} ... {% endfor%}
Вы должны использовать « 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([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))
Я просто продолжаю популярный ответ и делаю его более надежным. Это позволяет вам указать любую начальную точку, например 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 или жестко кодировать его. Добавление шага потребует тег шаблона, это должно охватывать больше случаев использования, так что это шаг вперед.
Это по существу требует range
функции. Для этого был подан билет на функцию Django ( https://code.djangoproject.com/ticket/13088 ), но он закрыт как "не исправит" со следующим комментарием.
У меня сложилось впечатление, что эта идея пытается привести к программированию в шаблоне. Если у вас есть список параметров, которые необходимо отобразить, они должны быть рассчитаны в представлении, а не в шаблоне. Если это так просто, как диапазон значений, то пусть будет так.
У них есть хорошая точка зрения. Предполагается, что шаблоны являются очень простым представлением представления. Вы должны создать ограниченные требуемые данные в представлении и перейти к шаблону в контексте.
Если число исходит от модели, я обнаружил, что это хороший патч для модели:
def iterableQuantity(self):
return range(self.quantity)
Для тех, кто ищет простой ответ, просто нужно отобразить количество значений, скажем, 3 из 100 сообщений, например, просто добавьте {% for post in posts|slice:"3" %}
и зациклите его как обычно, и будут добавлены только 3 сообщения.
{% for i in range(10) %}
{{ i }}
{% endfor %}