336 votes

Boucle numérique for dans les modèles Django

Comment puis-je écrire un numéro for dans un modèle Django ? Je veux dire quelque chose comme

for i = 1 to n

479voto

Udi Points 1584

J'ai utilisé une technique simple qui fonctionne bien pour les petits cas, sans balises spéciales et sans contexte supplémentaire. Parfois, cela s'avère utile

{% for i in '0123456789'|make_list %}
    {{ forloop.counter }}
{% endfor %}

9 votes

Pour info, 012 == 12, donc il ne bouclera que sur 1 et 2.

24 votes

{% for i in '0123456789'|make_list %} pour itérer sur les 10, sans sauter 0.

0 votes

Très astucieux. Mais pourquoi pas une compréhension de liste ? Cela enlève un peu le côté "hackish" mais utilise la même idée x = 5, y=[i for i in range(x)] context={'iterateover':y}

167voto

Żyźniewski Points 61
{% with ''|center:n as range %}
{% for _ in range %}
    {{ forloop.counter }}
{% endfor %}
{% endwith %}

13 votes

Excellente réponse. Cela fonctionne parce que le centre crée une chaîne de n espaces qui sont ensuite bouclés. Chaque caractère d'espace est ensuite ignoré, mais la valeur actuelle dans la plage peut être trouvée à partir de forloop.counter (ou forloop.counter0). Voir docs.djangoproject.com/fr/dev/ref/templates/builtins/#center

123voto

tghw Points 14244

Malheureusement, c'est non supporté dans le langage de gabarit de Django. Il existe un couple de suggestions mais ils semblent un peu complexes. Je mettrais simplement une variable dans le contexte :

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

et dans le modèle :

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

20 votes

Les motivations des auteurs de Django pour interdire l'utilisation de python dans les modèles semblent inutiles et sans conséquence par rapport à la douleur et à la perte de temps que représente le fait de ne pas l'avoir, sans parler de la nécessité d'inventer un langage entièrement nouveau alors qu'un langage parfaitement génial (python !) existe déjà !

2 votes

@Bogatyr Si c'est ce que vous voulez, utilisez Jinja2 : docs.djangoproject.com/fr/1.9/topics/templates/

0 votes

@Bogatyr Parce que, évidemment, rien de mal ne se passe, quand vous pouvez appeler clear_full_page_cache() dans un modèle (vu dans le magasin php/magento, cela a pris un temps considérable à déboguer). Enfin, il n'est pas très judicieux de laisser un serveur effectuer ce rendu, alors que côté client, cela peut être fait tout aussi facilement et à moindre coût, étant donné qu'aucune donnée n'est associée à ce rendu (sinon, il suffit d'itérer les données).

115voto

Mon point de vue sur cette question, je pense qu'il est le plus pythique. Créez un my_filters.py dans vos applications templatetags répertoire.

@register.filter(name='times') 
def times(number):
    return range(number)

Utilisation dans votre modèle :

{% load my_filters %}
{% for i in 15|times %}
    <li>Item</li>
{% endfor %}

2 votes

Je pense que c'est la bonne solution. Faites range(1, 16) pour obtenir des nombres commençant par 1, et non par 0.

3 votes

Créez également un fichier vide _ init _.py dans le répertoire templatetags. Ajoutez également les lignes suivantes au début de my_filters.py from django.template import Library;register = Library()

2 votes

Ajoutez un deuxième paramètre de filtre et vous obtenez la fonction de gamme complète intégrée à python. @register.filter(name='range') def filter_range(start, end): return range(start, end) Il est ensuite utilisé comme {% for i in 1|range:6 %}{% endfor %} . Voir la réponse complète ci-dessous....

69voto

ars Points 35803

Jetez un coup d'œil à ces modèles de filtres et de balises, qu'il est assez facile d'inclure dans votre application.

L'avantage de ces solutions par rapport aux autres (passage d'une plage de chiffres) est qu'une fois installées, elles seront toujours disponibles pour vos modèles et auteurs de modèles, sans avoir à passer explicitement une plage valide dans votre code de vue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X