Numérique pour la boucle dans modèles Django
Comment puis-je écrire un numérique for
boucle dans un Django template? Je veux dire quelque chose comme
for i = 1 to n
Vous devez vous connecter pour publier un commentaire.
Comment puis-je écrire un numérique for
boucle dans un Django template? Je veux dire quelque chose comme
for i = 1 to n
Vous devez vous connecter pour publier un commentaire.
J'ai utilisé une technique simple qui fonctionne très bien pour de petites affaires sans balises spéciales et aucun autre contexte. Parfois, cela est très pratique
{% for i in "x"|rjust:"100" %}
Malheureusement, c'est pas pris en charge dans le langage de template de Django. Il y a un couple de suggestions, mais ils semblent un peu complexes. Je voudrais juste mettre une variable dans le contexte:
et dans le modèle:
Mon point de vue sur cette question, je pense que c'est le plus beau. Je garde un my_filters.py sur le templatetags répertoire.
Et vous l'utiliser comme ceci:
range(1, 16)
obtenir des nombres à partir de 1 et non 0.from django.template import Library;register = Library()
@register.filter(name='range') def filter_range(start, end): return range(start, end)
Obtient alors utilisé comme{% for i in 1|range:6 %}{% endfor %}
. Voir la réponse ci-dessous....try: return range(number) except: return []
. De cette façon, il n'élève jamais une erreur et renvoie un tableau vide (similaire à la façon dont la plupart des modèle de fonctions de travail).Peut-être comme cela?
Vous pouvez passer d'une liaison de
pour le modèle, puis faire
Note que vous obtiendrez de 0 basée sur le comportement (0, 1, ... n-1).
(Mis à jour pour Python3 de compatibilité)
range(n)
en python 3, si je me souviens correctement, xrange était obsolète sur elleVous ne passez pas
n
lui-même, mais plutôtrange(n)
[la liste des entiers de 0 à n-1], à partir de votre point de vue à votre modèle, et dans le second, vous ne{% for i in therange %}
(si vous en avez absolument insister sur 1 plutôt que la normal 0 index de base vous pouvez utiliserforloop.counter
dans la boucle du corps;-).Juste au cas où quelqu'un d'autre vient à travers cette question... j'ai créé un modèle de balise qui permet de créer un
range(...)
: http://www.djangosnippets.org/snippets/1926/Vous devez utiliser "tranche" dans le modèle, un exemple, comme ceci:
dans views.py
dans store_list.html:
Cette méthode prend en charge toutes les fonctionnalités de la norme
range([start,] stop[, step])
fonction<app>/templatetags/range.py
Utilisation:
Sortie
J'ai essayé très dur sur cette question, et je trouve que la meilleure réponse ici:
(à partir de comment faire une boucle 7 fois dans les modèles django)
Vous pouvez même accéder au idx!
views.py:
html:
Vous pouvez passer :
{ 'n' : range(n) }
À utiliser un modèle :
{% for i in n %}
...
{% finpour %}
Je suis juste en prenant de la réponse un peu plus loin et de le rendre plus robuste. Cela vous permet de spécifier n'importe quel point de départ, donc 0 ou 1 par exemple. Il utilise aussi un python de gamme disposent d'où la fin est un de moins de sorte qu'il peut être utilisé directement avec la liste des longueurs par exemple.
Puis dans votre modèle d'inclure le modèle ci-dessus de la balise de fichier et utiliser les éléments suivants:
Maintenant vous pouvez le faire 1 à 6 au lieu de simplement 0-6 ou codage en dur elle. L'ajout d'une étape nécessiterait une balise de modèle, ce qui devrait couvrir plus de cas d'utilisation c'est donc un pas en avant.
Vous pouvez utiliser:
{% with ''|center: i as range %}
Cela nécessite une
range
fonction. Une feature de Django billet a été soulevée (https://code.djangoproject.com/ticket/13088) pour cela, mais fermé comme "ne sera pas corrigé" avec le commentaire suivant.Ils ont un bon point de Modèles sont censés être très simples représentations de la vue. Vous devez créer le peu de données nécessaires dans la vue et de passer pour le modèle dans le contexte.
Si le nombre est à venir à partir d'un modèle, j'ai trouvé ceci pour être un bon patch pour le modèle: