Frage

Ich habe eine URL dynamisch erstellen entsprechend der aktuellen URL. Mit Hilfe des {% url %}-Tag ist der einfachste Weg, es zu tun, aber ich brauche den aktuellen URL-Namen die neuen dynamisch zu generieren.

Wie kann ich die URL-Namen an die URLconf angebracht erhalten, dass führt zu der aktuellen Ansicht?

EDIT:. Ich weiß, ich manuell die URL mit get_absolute_url Handwerk, aber ich würde lieber vermeiden, es ist Teil eines Vortrags da, und ich möchte nur ein Weg zu bauen Urls zeigen

Die Schüler wissen, wie {% url %} zu verwenden. Sie werden wissen, mit einem Problem konfrontiert, wenn sie eine vollständigere URL auf dem aktuellen zu generieren haben. Der einfachste Weg ist {% url %} wieder zu verwenden, mit einigen Variationen. Da wir url benannt haben, müssen wir wissen, wie Sie den Namen der URL zu erhalten, dass die aktuelle Ansicht genannt.

EDIT 2: Ein weiterer Anwendungsfall ist Teile der Basisschablone anzuzeigen unterschiedlich entsprechend die Basisvorlage. Es gibt auch andere Möglichkeiten, um es (unter Verwendung von CSS und {% block%} zu tun, aber irgendwann einfach schön es in der Lage sein den Tag des Menüeintrags von base.html zu entfernen, wenn die Viewname den Link entsprechen.

War es hilfreich?

Lösung

Ich weiß nicht, wie lange diese Funktion ist Teil von Django gewesen ist, sondern als folgende Artikel zeigt, kann erreicht werden, wie in der Ansicht folgt:

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

Wenn Sie, dass in jeder Vorlage, eine Vorlage Anfrage schriftlich angemessen sein kann.

Edit: Hiefür DJANGO UPDATE

Nach der aktuellen Django Update:

Django 1.10 ( Link )

  

Importieren aus dem django.core.urlresolvers Modul ist veraltet in   zugunsten seiner neuen Position, django.urls

Django 2.0 ( link )

  

Das django.core.urlresolvers Modul ist für seine neue entfernt   Lage, django.urls.

Damit ist der richtige Weg zu tun ist, wie folgt aus:

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

Andere Tipps

Wie von Django 1.5 kann diese aus dem Request-Objekt zugegriffen werden

    current_url = request.resolver_match.url_name

https://docs.djangoproject.com/en/ dev / ref / Request-Response / # django.http.HttpRequest.resolver_match

Für diejenigen, die ihre URL-Mustern Namespace, dann können Sie in dem Namespace-URL Namen des Antrags interessieren. In diesem Fall genannt Django es view_name statt.

request.resolver_match.view_name

# return: <namespace>:<url name>

Dieses über erreicht werden:

request.resolver_match.url_name

Django> 1.8

Die Klärung der Frage: „In einer Ansicht, wie bekommt man den Namen eines URLPATTERN, dass Punkte auf sie, vorausgesetzt, es gibt genau eine solche URLPATTERN“

Dies kann aus den Gründen wünschenswert sein, heißt es:. Aus der Sicht wollen wir eine DRY Weg, um eine URL zu derselben Ansicht zu bekommen (wir wollen nicht haben, unsere eigenen URLPATTERN Namen kennen)

Kurze Antwort:. Es ist nicht wirklich einfach genug, um Ihre Klasse zu unterrichten, aber es könnte eine tolle Sache für Sie in einer Stunde oder zwei zu tun und auf GitHub erbrechen

Wenn Sie wirklich, dies tun wollten, würden Sie RegexURLResolver Unterklasse müssen und ändern die Entschlossenheit Methode, um die abgestimmte Muster zurückzukehren (von dem Sie den Pattern-Namen bekommen kann), anstatt die Ansicht und Schlüsselwort / Wert-Paaren. http://code.djangoproject.com/browser/ django / trunk / django / core / urlresolvers.py # L142

Sie könnten dann einen Dekorateur erstellen oder vielleicht geeignete Middleware mehr, dass Nutzungen diese Unterklasse den Modellnamen und Laden zu bekommen, dass Wert irgendwo in der Anforderung, so dass Ansichten sie verwenden können.

Wenn Sie tatsächlich das tun wollen, und Sie über einige Probleme laufen, lassen Sie mich wissen und ich kann wahrscheinlich helfen.

Für Ihre Klasse, hätte ich sie nur die Musternamen in der Ansicht oder eine Vorlage codieren. Ich glaube, dies ist die akzeptable Art und Weise tun.

Update: Je mehr ich über diese, desto mehr würde ich abraten versuchen, einen URLPATTERN Namen in einer Ansicht zu erhalten. URLPATTERN Parameter sind ziemlich unabhängig von den Parametern des Blicks auf sie verweisen. Wenn Sie auf eine bestimmte URL verweisen möchten, müssen Sie, wie Sie die URLPATTERN Werke kennen, nicht nur, wie Sie die Ansicht funktioniert. Wenn Sie, wie Sie die URLPATTERN Werke wissen müssen, könnten Sie auch haben, um den Namen des URLPATTERN kennen.

Es ist ein wenig aus Ihrer Frage unklar, aber http://docs.djangoproject.com/en/dev/topics/http/urls/ wird wahrscheinlich eine Erklärung liefern, was Sie sind nach.

Besonders nützlich zu sehen, wie Django verarbeitet Anforderungen:

Wenn ein Benutzer eine Seite aus der Django-powered Website anfordert, dann ist dies der Algorithmus das System, das Python-Code zu bestimmen, folgt auszuführen:

  1. Django bestimmt die Wurzel URLconf Modul zu verwenden. Normalerweise ist dies der Wert der ROOT_URLCONF Einstellung, aber wenn das ankommende Httprequest-Objekt ein Attribut namens URLconf (Satz von Middleware-Request-Verarbeitung) hat, wird ihr Wert anstelle der ROOT_URLCONF Einstellung verwendet werden.
  2. Django lädt das Python-Modul und sieht für die variablen urlpatterns. Dies sollte durch die Funktion django.conf.urls.defaults.patterns ().
  3. zurückgegeben eine Python-Liste, im Format
  4. Django läuft durch jedes URL-Muster um, und hält an dem ersten, die die angeforderten URL entspricht.
  5. Sobald einer der Regexes Streichhölzer, Django Importe und ruft die gegebene Ansicht, die eine einfache Python-Funktion ist. Die Ansicht wird eine Httprequest als erstes Argument und alle Werte in der Regex als restliche Argumente.
  6. erfaßt geben

Wenn Sie gerade nach dem vollständigen Pfad sind, können Sie versuchen:

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

Ich hoffe, das hilft -. Es gibt an, wie das URLconf Modul zu verwenden, und hoffentlich Punkt, den Sie in die richtige Richtung helfen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top