Comment écrire une for
boucle numérique dans un modèle Django? Je veux dire quelque chose comme
for i = 1 to n
Comment écrire une for
boucle numérique dans un modèle Django? Je veux dire quelque chose comme
for i = 1 to n
J'ai utilisé une technique simple qui fonctionne bien pour les petits cas sans balises spéciales et sans contexte supplémentaire. Parfois, cela est utile
{% for i in '0123456789'|make_list %}
{{ forloop.counter }}
{% endfor %}
{% for i in "x"|rjust:"100" %}
la source
Malheureusement, cela n'est pas pris en charge dans le langage de modèle Django. Il y a deux ou trois des suggestions , mais ils semblent un peu complexe. Je voudrais juste mettre une variable dans le contexte:
et dans le modèle:
la source
Mon point de vue sur cette question, je pense que c'est le plus beau. Je garde un my_filters.py dans le répertoire templatetags.
Et vous utiliseriez comme ceci:
la source
range(1, 16)
pour obtenir des nombres à partir de 1, pas de 0.from django.template import Library;register = Library()
@register.filter(name='range') def filter_range(start, end): return range(start, end)
S'habitue alors comme{% for i in 1|range:6 %}{% endfor %}
. Voir la réponse complète ci-dessous ....try: return range(number) except: return []
. De cette façon, il ne déclenche jamais d'erreur et renvoie un tableau vide (similaire à la façon dont la plupart des fonctions de modèle fonctionnent).Peut-être comme ça?
la source
Vous pouvez passer une liaison de
au modèle, puis faites
Notez que vous obtiendrez un comportement basé sur 0 (0, 1, ... n-1).
(Mis à jour pour la compatibilité Python3)
la source
range(n)
en python 3, si je me souviens bien, xrange était obsolèteVous ne vous passez pas
n
, mais plutôtrange(n)
[la liste des entiers de 0 à n-1 inclus], de votre vue à votre modèle, et dans ce dernier, vous le faites{% for i in therange %}
(si vous insistez absolument sur 1 basé sur le 0 normal index basé sur vous pouvez utiliserforloop.counter
dans le corps de la boucle ;-).la source
Au cas où quelqu'un d'autre tomberait sur cette question… J'ai créé une balise de modèle qui vous permet de créer un
range(...)
: http://www.djangosnippets.org/snippets/1926/la source
J'ai essayé très dur sur cette question, et je trouve la meilleure réponse ici: (de la façon de boucler 7 fois dans les modèles django )
Vous pouvez même accéder à l'idx!
views.py:
html:
la source
Tu peux passer :
{'n': plage (n)}
Pour utiliser le modèle:
{% pour i dans n%} ... {% endfor%}
la source
Vous devez utiliser " tranche " dans le modèle, un exemple comme celui-ci:
dans views.py
dans store_list.html:
la source
Cette méthode prend en charge toutes les fonctionnalités de la
range([start,] stop[, step])
fonction standard<app>/templatetags/range.py
Usage:
Production
la source
for value in 0|range:"10,2"
. Vous devez changer votre code comme suit:args = filter(lambda x: isinstance(x, int) and x >= 0, (_min, _max, _step))
J'amène juste la réponse populaire un peu plus loin et la rend plus robuste. Cela vous permet de spécifier n'importe quel point de départ, donc 0 ou 1 par exemple. Il utilise également la fonction de plage de python où la fin est un de moins afin qu'il puisse être utilisé directement avec des longueurs de liste par exemple.
Ensuite, dans votre modèle, incluez simplement le fichier de balises de modèle ci-dessus et utilisez ce qui suit:
Maintenant, vous pouvez faire 1-6 au lieu de seulement 0-6 ou le coder en dur. L'ajout d'une étape nécessiterait une balise de modèle, cela devrait couvrir plus de cas d'utilisation, c'est donc un pas en avant.
la source
Cela nécessite essentiellement une
range
fonction. Un ticket de fonctionnalité Django a été généré ( https://code.djangoproject.com/ticket/13088 ) pour cela, mais fermé comme "ne résoudra pas" avec le commentaire suivant.Ils ont un bon point - les modèles sont censés être des représentations très simples de la vue. Vous devez créer les données requises limitées dans la vue et passer au modèle dans le contexte.
la source
Vous pouvez utiliser:
{% with ''|center: i as range %}
la source
Si le numéro provient d'un modèle, j'ai trouvé que c'était un joli patch pour le modèle:
la source
Pour ceux qui recherchent une réponse simple, ayant juste besoin d'afficher une quantité de valeurs, disons 3 sur 100 messages par exemple, ajoutez-le
{% for post in posts|slice:"3" %}
et bouclez-le normalement et seuls 3 messages seront ajoutés.la source
la source