Question

Je dois construire une URL dynamiquement en fonction de l'URL actuelle. En utilisant la balise {% url %} est la meilleure façon de le faire, mais je dois le nom d'URL courant pour générer la nouvelle dynamique.

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

EDIT:. Je sais que je peux manuellement handcraft l'URL en utilisant get_absolute_url mais je préfère l'éviter car il fait partie d'une conférence et je voudrais démontrer qu'une seule façon de construire urls

Les élèves savent comment utiliser {% url %}. Ils savent sont confrontés à un problème quand ils doivent générer une URL plus complète basée sur l'actuel. La façon la plus simple est d'utiliser à nouveau {% url %}, avec quelques variations. Depuis que nous avons nommé url, nous avons besoin de savoir comment obtenir le nom de l'url qui a appelé la vue actuelle.

EDIT 2: un autre cas d'utilisation est pour afficher les parties du modèle de base différente selon le modèle de base. Il existe d'autres façons de le faire (en utilisant CSS et {% block%}, mais parfois il simplement agréable de pouvoir enlever l'étiquette de l'entrée de menu de base.html si le ViewName correspond le lien.

Était-ce utile?

La solution

Je ne sais pas combien de temps cette fonctionnalité fait partie de Django, mais comme lien )

  

importation à partir du module de django.core.urlresolvers est obsolète   faveur de son nouvel emplacement, django.urls

Django 2.0 ( lien )

  

Le module django.core.urlresolvers est retiré en faveur de son nouveau   emplacement, django.urls.

Ainsi, la bonne façon de faire est comme ceci:

from django.urls import resolve
current_url = resolve(request.path_info).url_name

Autres conseils

de Django 1.5, il est accessible à partir de l'objet de la demande

    current_url = request.resolver_match.url_name

https://docs.djangoproject.com/en/ dev / ref / demande-réponse / # django.http.HttpRequest.resolver_match

Pour ceux qui leur espace de nommage des modèles d'URL, alors vous pouvez être intéressé par le nom URL de la demande des espaces de noms. Dans ce cas, Django appelé view_name à la place.

request.resolver_match.view_name

# return: <namespace>:<url name>

Ceci peut être réalisé via:

request.resolver_match.url_name

Django> 1.8

La clarification de la question: «Dans une vue, comment obtenez-vous le nom d'un URLPATTERN qui pointe vers elle, en supposant qu'il existe exactement un tel URLPATTERN »

Il peut être souhaitable pour les raisons indiquées: à partir du point de vue, nous voulons un moyen DRY d'obtenir une URL pour la même vue (nous ne voulons pas avoir à connaître notre propre nom URLPATTERN)

.

Réponse courte:. Il est pas vraiment assez simple pour apprendre à votre classe, mais il pourrait être une chose amusante à faire pour vous dans une heure ou deux et jeter sur GitHub

Si vous voulez vraiment faire cela, vous devez sous-classe RegexURLResolver et modifier la méthode de détermination pour que le motif adapté (à partir de laquelle vous pouvez obtenir le nom du motif) au lieu de la vue et des paires mot-clé / valeur. http://code.djangoproject.com/browser/ django / tronc / django / core / urlresolvers.py # L142

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

Si vous voulez vraiment faire et vous rencontrez quelques problèmes, laissez-moi savoir et je peux probablement aider.

Pour votre classe, je voudrais juste avoir les codent en dur le nom de modèle dans la vue ou modèle. Je crois que c'est la façon acceptable de le faire.

Mise à jour: Plus je pense à ce sujet, plus je déconseille d'essayer d'obtenir un nom URLPATTERN dans une vue. paramètres urlPattern sont assez indépendants des paramètres de la vue qu'ils pointent. Si vous voulez pointer vers une certaine URL, vous devez savoir comment fonctionne urlPattern, pas seulement comment la vue fonctionne. Si vous avez besoin de savoir comment le URLPATTERN fonctionne, vous pourriez aussi bien avoir à connaître le nom du URLPATTERN.

Il est un peu pas clairement votre question, mais http://docs.djangoproject.com/en/dev/topics/http/urls/ sera probablement fournir une explication à ce vous êtes après.

Particulièrement utile de noter comment traite les demandes Django:

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

  1. Django détermine le module URLconf racine à utiliser. , Cela est habituellement la valeur du paramètre ROOT_URLCONF, mais si l'objet HttpRequest entrant a un attribut appelé URLconf (défini par le traitement des requêtes middleware), sa valeur sera utilisée à la place du réglage ROOT_URLCONF.
  2. Django charge ce module Python et recherche les urlpatterns variables. Cela devrait être une liste Python, dans le format renvoyé par la fonction django.conf.urls.defaults.patterns ().
  3. Django parcourt chaque modèle d'URL, dans l'ordre, et arrête à la première qui correspond à l'URL demandée.
  4. Une fois que l'une des expressions rationnelles correspond, Django importe et appelle la vue donnée, ce qui est une simple fonction Python. La vue est transmis un HttpRequest comme premier argument et toutes les valeurs saisies dans le regex 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 - il indique comment utiliser le module URLconf, et nous espérons aider à vous orienter dans la bonne direction

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top