104 votes

Comment obtenir le courant urlname à l'aide de Django?

Je dois construire une url dynamiquement en fonction de l'url courante. À l'aide de l' {% url %} balise est la meilleure façon de le faire, mais j'ai besoin de l'actuel nom de l'url pour générer une nouvelle dynamique.

Comment puis-je obtenir le nom de l'url attaché à l'urlconf qui mène à l'affichage en cours?

EDIT : je sais que je peux manuellement de l'artisanat de l'url à l'aide d' get_absolute_url mais je préfère éviter car il fait partie d'une conférence et je voudrais montrer qu'une façon de construire les url.

Les élèves savent comment utiliser {% url %}. Ils sont savoir face à un problème lorsqu'ils ont pour générer des url complète basée sur l'actuelle. Le plus simple est d'utiliser {% url %} encore, avec quelques variantes. Depuis que nous avons nommé url, nous avons besoin de savoir comment obtenir le nom de l'url qui appelle le point de vue actuel.

EDIT 2: autre exemple d'utilisation afficher les parties du modèle de base différently selon le modèle de base. Il y a d'autres façons de le faire (à l'aide de CSS et {% block %}, mais parfois il juste agréable d'être en mesure de supprimer la balise de l'entrée de menu de base.html si le viewname match le lien.

154voto

Lukas Bünger Points 781

Je ne sais pas combien de temps cette fonctionnalité a été une partie de Django, mais comme la suite de l'article le montre, il peut être réalisé de la façon suivante dans la vue:

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

Si vous avez besoin que, dans chaque modèle, la rédaction d'un modèle de demande peuvent être appropriées.

137voto

Bharathwaaj Points 550

Comme de Django 1.5, cela peut être accessible à partir de l'objet de la requête

    current_url = request.resolver_match.url_name

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

4voto

Conley Owens Points 1538

La Clarification de la question: "Dans une vue, comment voulez-vous obtenir le nom d'un urlpattern que des points, en supposant qu'il existe exactement un tel urlpattern."

Cela peut être souhaitable pour les raisons indiquées: depuis l'intérieur de la vue, nous voulons un SÈCHE façon d'obtenir une url pour le même point de vue (nous ne voulons pas avoir à connaître notre propre urlpattern nom).

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

Si tu voulais vraiment le faire, vous avez à la sous-classe RegexURLResolver et de modifier la méthode resolve pour retourner le motif correspondant (à partir de laquelle vous pouvez obtenir le nom du pattern) au lieu de la vue et des couples clé/valeur. http://code.djangoproject.com/browser/django/trunk/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 du motif et de stocker cette valeur quelque part dans la demande, de sorte que les vues de l'utiliser.

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

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

Mise à jour: Plus j'y pense, plus je pourrait décourager d'essayer d'obtenir un urlpattern nom dans une vue. urlpattern paramètres sont assez indépendants des paramètres de la vue qu'elles pointent. Si vous voulez une url, vous devez savoir comment le urlpattern œuvres, et pas seulement le point de vue des œuvres. Si vous avez besoin de savoir comment le urlpattern fonctionne, vous pourriez aussi bien avoir à connaître le nom de la urlpattern.

1voto

1voto

Mark Mayo Points 4193

C'est un peu difficile de votre question, mais http://docs.djangoproject.com/en/dev/topics/http/urls/ sera probablement fournir une explication à ce que vous êtes après.

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

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

  1. Django détermine la racine URLconf module à utiliser. Normalement, c'est la valeur de la ROOT_URLCONF paramètre, mais si l'entrant objet HttpRequest a un attribut appelé urlconf (défini par le middleware de traitement de la demande), sa valeur sera utilisée à la place de la ROOT_URLCONF réglage.
  2. Django charges du module Python et regarde pour la variable urlpatterns. Ce doit être une liste Python, dans le format retourné par la fonction django.conf.les url.les valeurs par défaut.patterns().
  3. Django traverse chaque modèle d'URL, dans l'ordre, et s'arrête à la première, qui correspond à l'URL demandée.
  4. Une fois l'un des regexes matches, Django les importations et les appels à la vue donnée, qui est une simple fonction Python. La vue est passé un HttpRequest comme premier argument et toutes les valeurs saisies dans la regex comme arguments restants.

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

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

J'espère que permet - il indique comment utiliser l'URLconf module, et j'espère qu'il va aider à vous diriger dans la bonne direction.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X