qu'est-ce que reverse () dans Django
Quand je lis du code django parfois, je vois dans certains modèles reverse()
. Je ne suis pas tout à fait sûr de ce que c'est mais il est utilisé avec HttpResponseRedirect. Comment et quand est-ce reverse()
censé être utilisé?
Ce serait bien si quelqu'un donnait une réponse avec quelques exemples...
5 réponses
Https://docs.djangoproject.com/en/stable/ref/urlresolvers/#reverse
Dans votre urls.py
définissez ceci:
url(r'^foo$', some_view, name='url_name'),
Dans un modèle, vous pouvez vous référer à cette url:
<!-- django <= 1.4 -->
<a href="{% url url_name %}">link which calls some_view</a>
<!-- django >= 1.5 or with {% load url from future %} in your template -->
<a href="{% url 'url_name' %}">link which calls some_view</a>
Cela sera rendu comme
<a href="/foo/">link which calls some_view</a>
Dites Maintenant que vous voulez faire quelque chose de similaire dans votre views.py
- par exemple, vous gérez une autre url (pas /foo/
) dans une autre vue (pas some_view
) et vous voulez rediriger l'utilisateur vers /foo/
(souvent le cas sur un formulaire réussi la soumission)
Vous pourriez juste faire
return HttpResponseRedirect('/foo/')
, Mais que faire si vous voulez changer l'url dans l'avenir vous devez mettre à jour votre urls.py
et, toutes les références dans votre code. Cela viole SEC (google).
Au Lieu de cela, vous pouvez dire
from django.urls import reverse
return HttpResponseRedirect(reverse('url_name'))
Cela parcourt toutes les URL définies dans votre projet pour l'url définie avec le nom url_name
et renvoie l'url réelle /foo/
.
Cela signifie que vous ne référez à l'url que par son attribut name
- Si vous vous voulez changer l'url elle-même ou la vue à laquelle elle se réfère, vous pouvez le faire en éditant un seul endroit - urls.py
. Cette idée d'éditer un seul endroit est appelée "ne vous répétez pas" et est quelque chose à rechercher.
Il y a un doc pour cela
Https://docs.djangoproject.com/en/dev/topics/http/urls/#reverse-resolution-of-urls
, Il peut être utilisé pour générer une URL pour une vue donnée
Le principal avantage est que vous n'avez pas de routes de code dur dans votre code.
C'est une vieille question, mais voici quelque chose qui pourrait aider quelqu'un.
Des documents officiels:
Django fournit des outils pour effectuer une inversion D'URL qui différentes couches où les URL sont nécessaires: dans les Modèles: Utilisation de l'url balise de modèle. Dans le code Python: en utilisant la fonction reverse (). En plus code de niveau lié à la gestion des URL des instances de modèle Django: méthode get_absolute_url ().
Par exemple. dans les modèles (url tag)
<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>
Par exemple. dans le code python (en utilisant la fonction reverse
)
return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))
La fonction prend en charge le principe dry-s'assurer que vous ne codez pas les URL dans toute votre application. Une url doit être définie en un seul endroit, et un seul endroit - votre URL conf. Après cela, vous ne faites que référencer cette information.
Utilisez reverse()
pour vous donner l'url d'une page, soit le chemin d'accès à la vue, soit le paramètre page_name de votre URL conf. Vous l'utiliseriez dans les cas où cela n'a pas de sens de le faire dans le modèle avec {% url 'my-page' %}
.
Il y a beaucoup de possibles endroits où vous pouvez utiliser cette fonctionnalité. Un endroit que j'ai trouvé que je l'utilise Est lors de la redirection des utilisateurs dans une vue (souvent après le traitement réussi d'un formulaire) -
return HttpResponseRedirect(reverse('thanks-we-got-your-form-page'))
, Vous pouvez également l'utiliser lors de l'écriture des balises de modèle.
Une autre fois que j'ai utilisé reverse()
était avec l'héritage du modèle. J'avais un ListView sur un modèle parent, mais je voulais obtenir de l'un de ces objets parents à la DetailView de son objet enfant associé. J'ai attaché une fonction get__child_url()
au parent qui identifié l'existence d'un enfant et retourné l'url de son DetailView en utilisant reverse()
.
La fonction reverse () est utilisée pour respecter le principe django DRY, c'est-à-dire que si vous modifiez l'url à l'avenir, vous pouvez référencer cette url en utilisant reverse(urlname).