Como eu escrevo um for
loop numérico em um modelo do Django? Quero dizer algo como
for i = 1 to n
Como eu escrevo um for
loop numérico em um modelo do Django? Quero dizer algo como
for i = 1 to n
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" %}
fonte
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:
e no modelo:
fonte
Minha opinião sobre esta questão, acho a mais legal. Eu mantenho um my_filters.py no diretório templatetags.
E você usaria assim:
fonte
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?
fonte
Você pode passar uma ligação de
para o modelo, então faça
Observe que você obterá um comportamento baseado em 0 (0, 1, ... n-1).
(Atualizado para compatibilidade com Python3)
fonte
range(n)
em python 3, se eu me lembro corretamente, xrange foi depreciado sobre eleVocê não passa por
n
si só, mas simrange(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 usarforloop.counter
no corpo do loop ;-).fonte
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/fonte
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:
html:
fonte
Você pode passar:
{'n': intervalo (n)}
Para usar o modelo:
{% para i em n%} ... {% endfor%}
fonte
Você deve usar " fatia " no modelo, um exemplo como este:
em views.py
em store_list.html:
fonte
Este método suporta toda a funcionalidade da
range([start,] stop[, step])
função padrão<app>/templatetags/range.py
Uso:
Resultado
fonte
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.
Em seu modelo, inclua o arquivo de tag de modelo acima e use o seguinte:
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.
fonte
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.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.
fonte
Você pode usar:
{% with ''|center: i as range %}
fonte
Se o número é proveniente de um modelo, achei esse um bom patch para o modelo:
fonte
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.fonte
fonte