Comment générer des URL dans Django
-
09-06-2019 - |
Question
Dans le langage de modèle de Django, vous pouvez utiliser {% url [viewname] [args] %}
pour générer une URL vers une vue spécifique avec des paramètres.Comment pouvez-vous faire la même chose par programmation dans le code Python ?
Ce dont j'ai besoin, c'est de créer une liste d'éléments de menu où chaque élément a un nom, une URL et un indicateur actif (qu'il s'agisse de la page actuelle ou non).En effet, il sera beaucoup plus propre de faire cela en Python qu'avec le langage de modèle.
La solution
Si vous devez utiliser quelque chose de similaire au {% url %}
balise template dans votre code, Django fournit la django.core.urlresolvers.reverse()
.Le reverse
la fonction a la signature suivante :
reverse(viewname, urlconf=None, args=None, kwargs=None)
Autres conseils
J'utilise deux approches différentes dans mon models.py
.Le premier est le permalink
décorateur:
from django.db.models import permalink
def get_absolute_url(self):
"""Construct the absolute URL for this Item."""
return ('project.app.views.view_name', [str(self.id)])
get_absolute_url = permalink(get_absolute_url)
Vous pouvez également appeler reverse
directement:
from django.core.urlresolvers import reverse
def get_absolute_url(self):
"""Construct the absolute URL for this Item."""
return reverse('project.app.views.view_name', None, [str(self.id)])
Sachez qu'en utilisant reverse()
nécessite que votre module urlconf soit 100 % sans erreur et puisse être traité - je ne le fais pas ViewDoesNotExist
erreurs ou plus, ou vous obtenez le redoutable NoReverseMatch
exception (les erreurs dans les modèles échouent généralement silencieusement, ce qui entraîne None
).