django-templates {% include - Числовое значение для цикла в шаблонах Django





8 Answers

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

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

и в шаблоне:

{% for i in range %}
     ...
{% endfor %}
%} фильтры теги

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

for i = 1 to n



Я беру эту проблему, я думаю, это самое приятное. Я храню файл 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 %}



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

{'n' : range(n) }

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

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

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

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




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




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




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

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

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




Если число приходит от модели, я нашел, что это хороший патч для модели:

def iterableQuantity(self):
    return range(self.quantity)





Related