quel est l'inverse() dans Django
Quand j'ai lu django code 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é de concert avec HttpResponseRedirect. Comment et quand est-ce reverse()
censé être utilisé?
Il serait gentil si quelqu'un a donné une réponse avec quelques exemples...
- Étant donné un modèle d'url, Django utilise l'url() pour choisir la vue de droite et de générer une page. C'est,
url--> view name
. Mais parfois, comme lors de la redirection, vous devez aller dans la direction inverse et donner Django le nom de la vue, et Django génère l'url appropriée. En d'autres termes,view name --> url
. C'est,reverse()
(c'est l'inverse de la fonction url). Il peut sembler plus transparent à l'viens de l'appelergenerateUrlFromViewName
mais c'est trop long et probablement pas assez générale: docs.djangoproject.com/en/dev/topics/http/urls/... - Bonne explication, merci. Ce nom semblait (et me semble) en particulier les non-intuitif pour moi, que je tiens à être un péché grave. Qui ne les déteste pas inutile de dissimulation?
Vous devez vous connecter pour publier un commentaire.
reverse()
| documentation de DjangoDans votre
urls.py
définir ce:Dans un modèle, vous pouvez vous référer à cette url:
Cela va être traduit comme:
Maintenant dites que vous voulez faire quelque chose de similaire dans votre
views.py
- par exemple, vous êtes la manipulation de certains autres url (pas/foo/
) dans certains autre point de vue (passome_view
) et que vous souhaitez rediriger l'utilisateur vers/foo/
(souvent le cas sur le succès de la soumission du formulaire).Vous pourriez faire:
Mais si vous voulez changer l'url dans l'avenir? Vous devrez donc mettre à jour votre
urls.py
et toutes les références dans votre code. Cela viole DRY (Don't Repeat Yourself), l'idée d'éditer un seul endroit, ce qui est un objectif à atteindre.Au lieu de cela, vous pouvez dire:
Cela ressemble à travers toutes les url définies dans votre projet pour l'url définie avec le nom
url_name
et retourne l'url réelle/foo/
.Cela signifie que vous vous référez à l'url que par son
name
attribut - si vous souhaitez modifier l'url elle-même ou de la vue, il se réfère à vous pouvez le faire en modifiant un seul endroit -urls.py
.{{ url 'url_name' }}
devrait être{% url url_name %}
dans Django 1.4 ou version antérieure. Cela va changer dans la prochaine version de Django (1.5) et devrait ensuite être{% url 'url_name' %}
. Les docs pour la url templatetag donner quelques bonnes infos si vous descendez un peu pour le "en avant la compatibilité de la section"{% %}
pas variable tags{{ }}
pour la balise d'url 🙂url_reverse
. La meilleure façon de faire face à ces sortes de bizarreries, c'est de refuser de les utiliser.C'est une vieille question, mais voici quelque chose qui pourrait aider quelqu'un.
De l'officiel docs:
Par exemple. dans les modèles (url)
Par exemple. dans le code python (à l'aide de la
reverse
fonction)Il y a une doc pour que
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
principal avantage est que vous n'avez pas coder en dur les routes dans votre code.
La fonction prend en charge le principe dry - en vous assurant de ne pas coder en dur les url dans votre application. Une url doit être définie en un lieu et en un seul endroit - votre url de la conf. Après que vous êtes vraiment juste en faisant référence à cette info.
Utilisation
reverse()
pour vous donner l'url d'une page, étant donné le chemin d'accès à la vue, ou la nom_page paramètre à partir de votre url de la conf. Vous pouvez l'utiliser dans les cas où il n'est pas judicieux de le faire dans le modèle avec{% url 'my-page' %}
.Il y a beaucoup d'endroits possibles, vous pouvez utiliser cette fonctionnalité. Un endroit que j'ai trouvé je l'utilise, c'est quand la redirection des utilisateurs en vue (souvent après le traitement 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, j'ai utilisé
reverse()
a avec le modèle de l'héritage. J'ai eu une ListView sur un modèle parent, mais je voulais obtenir à partir de l'un quelconque de ces objets parents à la fenêtrede travail de ses associés enfant objet. J'ai attaché uneget__child_url()
fonction pour le parent qui a identifié l'existence d'un enfant et a renvoyé l'url de la fenêtre detravail à l'aide dereverse()
.Les réponses existantes a fait un bon travail en expliquant la ce de cette
reverse()
fonction dans Django.Cependant, j'avais espéré que ma réponse jeter un éclairage différent à la pourquoi: pourquoi utiliser
reverse()
à la place d'autres, plus simple, sans doute plus pythonic approches en modèle-vue de liaison, et ce sont des raisons légitimes de la popularité de ce "rediriger viareverse()
pattern" dans Django la logique de routage.L'un des principaux avantages est l'inverse de la construction d'une url, comme d'autres l'ont mentionné. Juste comme la façon dont vous utilisez
{% url "profile" profile.id %}
pour générer l'url de votre application url du fichier de configuration: par exemple,path('<int:profile.id>/profile', views.profile, name="profile")
.Mais que les OP ont noté, l'utilisation de
reverse()
est également souvent associé à l'utilisation deHttpResponseRedirect
. Mais pourquoi?De considérer les éléments suivants
views.py
:Et nos minimes
urls.py
:Dans le
vote()
fonction, le code de notreelse
bloc utilisereverse
avecHttpResponseRedirect
dans le modèle suivant:Cela signifie tout d'abord nous n'avons pas à coder en dur l'adresse URL (en cohérence avec le principe SEC), mais plus fondamentalement,
reverse()
offre un moyen élégant pour construire des chaînes d'URL par la manipulation de valeurs déballé de l'argumentation (args=(question.id)
est gérée par URLConfig). Censéquestion
a un attributid
qui contient la valeur5
, l'URL construite à partir de l'reverse()
serait alors:Dans le modèle normal-voir code de liaison, nous utilisons
HttpResponse()
ourender()
comme elles consistent généralement en moins d'abstraction: un point de vue de la fonction de retour d'un modèle:Mais dans de nombreux légitime cas de redirection, généralement, nous nous soucions de la construction de l'URL à partir d'une liste de paramètres. Il s'agit de cas tels que:
POST
demandeLa plupart de ceux-ci impliquent une certaine forme de redirection, et une URL construite à travers un ensemble de paramètres. Espérons que cela s'ajoute à la déjà utile thread de réponses!
L'inverse() est utilisé pour faire adhérer la django principe DRY je.e si vous modifiez l'url dans l'avenir, alors vous pouvez faire référence à cette url à l'aide de l'inverse(urlname).
Les questions /réponses sont assez claires. Juste au cas où vous ne savez pas pourquoi il est appelé
reverse
: Il faut une entrée d'un nom d'url et donne l'url, ce qui est l'inverse pour avoir une url d'abord et ensuite lui donner un nom.