Respostas:
Eu usei uma técnica simples que funciona bem para casos pequenos, sem tags especiais e sem contexto adicional. Às vezes isso é útil
{% 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 %}
Infelizmente, isso não é suportado na linguagem de modelo do Django. Há um par de sugestões , mas eles parecem um pouco complexo. Eu apenas colocaria uma variável no contexto:
...
render_to_response('foo.html', {..., 'range': range(10), ...}, ...)
...
e no modelo:
{% for i in range %}
...
{% endfor %}
Minha opinião sobre esta questão, acho a mais legal. Eu mantenho um my_filters.py no diretório templatetags.
@register.filter(name='times')
def times(number):
return range(number)
E você usaria assim:
{% load my_filters %}
{% for i in 15|times %}
<li>Item</li>
{% endfor %}
range(1, 16)
para obter números a partir de 1, não 0.
from django.template import Library;register = Library()
@register.filter(name='range') def filter_range(start, end): return range(start, end)
Então se acostuma como {% for i in 1|range:6 %}{% endfor %}
. Veja a resposta completa abaixo ....
try: return range(number) except: return []
. Dessa forma, nunca gera um erro e retorna uma matriz vazia (semelhante à maneira como a maioria das funções de modelo funciona).
Talvez assim?
{% for i in "x"|rjust:"100" %}
...
{% endfor %}
Você pode passar uma ligação de
{'n' : range(n) }
para o modelo, então faça
{% for i in n %}
...
{% endfor %}
Observe que você obterá um comportamento baseado em 0 (0, 1, ... n-1).
(Atualizado para compatibilidade com Python3)
range(n)
em python 3, se eu me lembro corretamente, xrange foi depreciado sobre ele
Você não passa por n
si só, mas sim range(n)
[a lista de números inteiros de 0 a n-1 incluídos], da sua exibição para o seu modelo e, no último, você o faz {% for i in therange %}
(se você absolutamente insistir em 0 com base em 1 e não no 0 normal) índice baseado em você pode usar forloop.counter
no corpo do loop ;-).
Apenas coloque alguém que se depare com esta pergunta ... Eu criei uma tag de modelo que permite criar uma range(...)
: http://www.djangosnippets.org/snippets/1926/
Aceita os mesmos argumentos que o 'intervalo' interno e cria uma lista contendo o resultado de 'range'. Sintaxe: {% mkrange [start,] stop [, step] como context_name%} Por exemplo: {% mkrange 5 10 2 como some_range%} {% para i em some_range%} {{i}}: algo que quero repetir \ n {% endfor%} Produz: 5: Algo que quero repetir 7: Algo que quero repetir 9: Algo que quero repetir
Eu tentei muito essa questão e encontro a melhor resposta aqui: (de como fazer um loop 7 vezes nos modelos de django )
Você pode até acessar o idx!
views.py:
context['loop_times'] = range(1, 8)
html:
{% for i in loop_times %}
<option value={{ i }}>{{ i }}</option>
{% endfor %}
Você pode passar:
{'n': intervalo (n)}
Para usar o modelo:
{% para i em n%} ... {% endfor%}
Você deve usar " fatia " no modelo, um exemplo como este:
em views.py
contexts = {
'ALL_STORES': Store.objects.all(),
}
return render_to_response('store_list.html', contexts, RequestContext(request, processors=[custom_processor]))
em store_list.html:
<ul>
{% for store in ALL_STORES|slice:":10" %}
<li class="store_item">{{ store.name }}</li>
{% endfor %}
</ul>
Este método suporta toda a funcionalidade da range([start,] stop[, step])
função padrão
<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)
Uso:
{% 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>
Resultado
<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"
. Você deve alterar seu código da seguinte maneira:args = filter(lambda x: isinstance(x, int) and x >= 0, (_min, _max, _step))
Estou apenas levando a resposta popular um pouco mais longe e tornando-a mais robusta. Isso permite que você especifique qualquer ponto de início, então 0 ou 1, por exemplo. Ele também usa o recurso range do python, onde o final é um a menos, para que possa ser usado diretamente com comprimentos de lista, por exemplo.
@register.filter(name='range')
def filter_range(start, end):
return range(start, end)
Em seu modelo, inclua o arquivo de tag de modelo acima e use o seguinte:
{% for c in 1|range:6 %}
{{ c }}
{% endfor %}
Agora você pode fazer 1-6 em vez de apenas 0-6 ou codificá-lo. A adição de uma etapa exigiria uma tag de modelo. Isso deve abranger mais casos de uso, portanto é um passo à frente.
Isso requer essencialmente uma range
função. Um ticket de recurso do Django foi gerado ( https://code.djangoproject.com/ticket/13088 ) para isso, mas fechado como "não será corrigido" com o seguinte comentário.
Minha impressão dessa idéia é que ela está tentando levar à programação no modelo. Se você tiver uma lista de opções que precisam ser renderizadas, elas deverão ser computadas na visualização, não no modelo. Se isso é tão simples quanto um intervalo de valores, que assim seja.
Eles têm um bom argumento - os modelos devem ser representações muito simples da exibição. Você deve criar os dados necessários limitados na visualização e passar para o modelo no contexto.
Você pode usar:
{% with ''|center: i as range %}
Se o número é proveniente de um modelo, achei esse um bom patch para o modelo:
def iterableQuantity(self):
return range(self.quantity)
Para aqueles que procuram uma resposta simples, apenas precisando exibir uma quantidade de valores, digamos 3 entre 100 postagens, por exemplo, basta adicionar {% for post in posts|slice:"3" %}
e repetir normalmente e apenas 3 postagens serão adicionadas.
{% for i in range(10) %}
{{ i }}
{% endfor %}