web-dev-qa-db-fra.com

Comment obtenir le nom de l'URL actuelle en utilisant Django?

Je dois créer une URL dynamiquement en fonction de l'URL actuelle. En utilisant le {% url %} tag est le moyen le plus simple de le faire, mais j'ai besoin du nom de l'URL actuelle pour générer le nouveau dynamiquement.

Comment puis-je obtenir le nom de l'URL attaché à l'urlconf qui mène à la vue actuelle?

EDIT: je sais que je peux manuellement fabriquer l'url à la main en utilisant get_absolute_url mais je préfère l'éviter car cela fait partie d'une conférence et je voudrais montrer une seule façon de construire des URL.

Les étudiants savent utiliser {% url %}. Ils sont confrontés à un problème lorsqu'ils doivent générer une URL plus complète basée sur celle en cours. Le moyen le plus simple consiste à utiliser {% url %} encore une fois, avec quelques variantes. Puisque nous avons nommé url, nous devons savoir comment obtenir le nom de l'url qui a appelé la vue actuelle.

EDIT 2: un autre cas d'utilisation consiste à afficher différemment des parties du modèle de base en fonction du modèle de base. Il existe d'autres façons de le faire (en utilisant CSS et {% block%}, mais parfois c'est bien de pouvoir supprimer la balise de l'entrée de menu de base.html si le nom de la vue correspond au lien.

81
e-satis

Je ne sais pas depuis combien de temps cette fonctionnalité fait partie de Django mais comme le montre article suivant , elle peut être réalisée comme suit dans la vue:

   from Django.core.urlresolvers import resolve
   current_url = resolve(request.path_info).url_name

Si vous en avez besoin dans chaque modèle, l'écriture d'une demande de modèle peut être appropriée.

Edit: APPLICATION DE NOUVEAU Django UPDATE

Suite à la mise à jour Django actuelle:

Django 1.10 ( lien )

Importation à partir du Django.core.urlresolvers le module est déconseillé au profit de son nouvel emplacement, Django.urls

Django 2.0 ( lien )

Le Django.core.urlresolvers le module est supprimé au profit de son nouvel emplacement, Django.urls.

Ainsi, la bonne façon de procéder est la suivante:

from Django.urls import resolve
current_url = resolve(request.path_info).url_name
112
Lukas Bünger

À partir de Django 1.5, ceci est accessible depuis l'objet de requête

    current_url = request.resolver_match.url_name

https://docs.djangoproject.com/en/dev/ref/request-response/#Django.http.HttpRequest.resolver_match

101
Bharathwaaj

Pour ceux qui nomment leurs modèles d'URL, vous pouvez être intéressé par le nom d'URL à espace de noms de la demande. Dans ce cas, Django l'a appelé view_name au lieu.

request.resolver_match.view_name

# return: <namespace>:<url name>
20
Yeo

Ceci peut être réalisé via:

request.resolver_match.url_name

Django> 1.8

10
niespodd

Clarification de la question: "Dans une vue, comment obtenir le nom d'un modèle d'URL qui pointe vers lui, en supposant qu'il existe exactement un tel modèle d'URL."

Cela peut être souhaitable pour les raisons indiquées: à partir de la vue, nous voulons une manière DRY d'obtenir une URL vers la même vue (nous ne voulons pas avoir à connaître notre propre nom de modèle d'URL). ).

Réponse courte: Ce n'est pas vraiment assez simple pour enseigner à votre classe, mais ce pourrait être une chose amusante à faire dans une heure ou deux et à vomir sur GitHub.

Si vous voulez vraiment le faire, vous devrez sous-classer RegexURLResolver et modifier la méthode de résolution pour renvoyer le modèle correspondant (à partir duquel vous pouvez obtenir le nom du modèle) au lieu des paires vue et mot-clé/valeur. http://code.djangoproject.com/browser/Django/trunk/Django/core/urlresolvers.py#L142

Vous pouvez ensuite créer un décorateur ou un middleware plus approprié qui utilise cette sous-classe pour obtenir le nom du modèle et stocker cette valeur quelque part dans la demande afin que les vues puissent l'utiliser.

Si vous voulez vraiment le faire et que vous rencontrez des problèmes, faites-le moi savoir et je peux probablement vous aider.

Pour votre classe, je voudrais juste leur coder en dur le nom du modèle dans la vue ou le modèle. Je pense que c'est la façon acceptable de procéder.

Mise à jour: Plus j'y pense, plus je décourage d'essayer d'obtenir un nom d'urlpattern dans une vue. Les paramètres urlpattern sont assez indépendants des paramètres de la vue vers laquelle ils pointent. Si vous souhaitez pointer vers une certaine URL, vous devez savoir comment fonctionne le modèle d'URL, et pas seulement comment fonctionne la vue. Si vous avez besoin de savoir comment fonctionne l'urlpattern, vous devrez peut-être tout aussi bien connaître le nom de l'urlpattern.

3
Conley Owens
1
gruszczy

Votre question n'est pas claire, mais http://docs.djangoproject.com/en/dev/topics/http/urls/ fournira probablement une explication de ce que vous recherchez.

Particulièrement utile pour noter comment Django traite les requêtes:

Lorsqu'un utilisateur demande une page à partir de votre site Django, c'est l'algorithme que le système suit pour déterminer quel code Python à exécuter:

  1. Django détermine le module racine URLconf à utiliser. En règle générale, il s'agit de la valeur du paramètre ROOT_URLCONF, mais si l'objet HttpRequest entrant a un attribut appelé urlconf (défini par le traitement des demandes de middleware), sa valeur sera utilisée à la place du paramètre ROOT_URLCONF.
  2. Django charge ce module Python et recherche la variable urlpatterns. Il doit s'agir d'une liste Python, au format renvoyé par la fonction Django.conf.urls. defaults.patterns ().
  3. Django parcourt chaque modèle d'URL, dans l'ordre, et s'arrête au premier qui correspond à l'URL demandée.
  4. Une fois que l'une des expressions rationnelles correspond, Django importe et appelle la vue donnée, qui est une simple fonction Python. La vue reçoit un HttpRequest comme premier argument) et toutes les valeurs capturées dans l'expression régulière comme arguments restants.

Si vous êtes juste après le chemin complet, vous pouvez essayer:

http://docs.djangoproject.com/en/dev/ref/request-response/#Django.http.HttpRequest.get_full_path

J'espère que cela aide - il indique comment utiliser le module URLconf, et j'espère que cela vous aidera à vous orienter dans la bonne direction.

0
Mark Mayo