Відповіді:
Я використовував просту техніку, яка чудово працює для невеликих випадків, без спеціальних тегів і без додаткового контексту. Іноді це стане в нагоді
{% 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 у каталозі тегів шаблонів.
@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 [початок,] зупинка [, крок] як контекст_імен%} Наприклад: {% mkrange 5 10 2 як some_range%} {% для i в some_range%} {{i}}: Щось я хочу повторити \ n {% endfor%} Виробляє: 5: Щось я хочу повторити 7: Щось я хочу повторити 9: Щось я хочу повторити
Я дуже постарався в цьому питанні, і найкращу відповідь тут знаходжу: (від того, як 7 разів зациклюватися на шаблонах джанго )
Ви навіть можете отримати доступ до idx!
views.py:
context['loop_times'] = range(1, 8)
html:
{% for i in loop_times %}
<option value={{ i }}>{{ i }}</option>
{% endfor %}
Ви можете пройти:
{'n': діапазон (n)}
Щоб використовувати шаблон:
{% for i in n%} ... {% endfor%}
Ви повинні використовувати " скибочку " у шаблоні, наприклад такий:
у 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
функції. Квиток на функцію "Джанго" було піднято ( https://code.djangoproject.com/ticket/13088 ) для цього, але закрито, оскільки "не виправиться" із наступним коментарем.
Моє враження від цієї ідеї полягає в тому, що вона намагається привести до програмування в шаблоні. Якщо у вас є перелік параметрів, які потрібно візуалізувати, їх слід обчислити у поданні, а не в шаблоні. Якщо це так просто, як діапазон значень, то так і буде.
Вони мають гарний момент - шаблони повинні бути дуже простими уявленнями про погляд. Вам слід створити обмежені необхідні дані у поданні та передати шаблону в контексті.
Для тих, хто шукає простої відповіді, просто потрібно відобразити кількість значень, скажімо, 3 зі 100 повідомлень, наприклад, просто додайте {% for post in posts|slice:"3" %}
і циклічно додайте її, і лише 3 повідомлення будуть додані.
Якщо номер походить від моделі, я вважаю, що це хороший виправлення до моделі:
def iterableQuantity(self):
return range(self.quantity)
{% for i in range(10) %}
{{ i }}
{% endfor %}