Comment puis-je écrire un numéro for
dans un modèle Django ? Je veux dire quelque chose comme
for i = 1 to n
Comment puis-je écrire un numéro for
dans un modèle Django ? Je veux dire quelque chose comme
for i = 1 to n
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}
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
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 %}
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à !
@Bogatyr Si c'est ce que vous voulez, utilisez Jinja2 : docs.djangoproject.com/fr/1.9/topics/templates/
@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).
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 %}
Je pense que c'est la bonne solution. Faites range(1, 16)
pour obtenir des nombres commençant par 1, et non par 0.
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()
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....
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 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.