Ich muss eine URL dynamisch entsprechend der aktuellen URL erstellen. Die Verwendung des {% url %}
Tags ist der einfachste Weg, aber ich benötige den aktuellen URL-Namen, um den neuen dynamisch zu generieren.
Wie kann ich den URL-Namen an die URL-Konfiguration anhängen, die zur aktuellen Ansicht führt?
BEARBEITEN: Ich weiß, dass ich die URL manuell von Hand erstellen kann, get_absolute_url
aber ich möchte sie lieber vermeiden, da sie Teil einer Vorlesung ist und ich nur einen Weg zum Erstellen von URLs demonstrieren möchte.
Die Schüler wissen, wie man es benutzt {% url %}
. Sie wissen, dass sie vor einem Problem stehen, wenn sie eine vollständigere URL basierend auf der aktuellen erstellen müssen. Am einfachsten ist es {% url %}
, mit einigen Variationen erneut zu verwenden. Da wir url benannt haben, müssen wir wissen, wie wir den Namen der URL erhalten, die die aktuelle Ansicht aufgerufen hat.
BEARBEITEN 2: Ein weiterer Anwendungsfall besteht darin, Teile der Basisvorlage je nach Basisvorlage unterschiedlich anzuzeigen. Es gibt andere Möglichkeiten, dies zu tun (mit CSS und {% block%}, aber manchmal ist es einfach schön, das Tag des Menüeintrags von base.html entfernen zu können, wenn der Viewname mit dem Link übereinstimmt.
quelle
{{ request.get_full_path }}
Antworten:
Ich weiß nicht, wie lange diese Funktion bereits Teil von Django ist, aber wie der folgende Artikel zeigt, kann sie in der Ansicht wie folgt erreicht werden:
Wenn Sie dies in jeder Vorlage benötigen, kann das Schreiben einer Vorlagenanforderung angebracht sein.
Bearbeiten: NEUES DJANGO-UPDATE ANWENDEN
Nach dem aktuellen Django-Update:
Django 1.10 ( Link )
Django 2.0 ( Link )
Der richtige Weg ist also folgender:
quelle
resolve()
kann nicht aufgelöst werden, wenn Sie eine Abfragezeichenfolge übergeben und einfach eine 404 auslösen.get_full_path()
Gibt den Pfad und die Abfragezeichenfolge zurück. Sie müssen verwendenresolve(request.path_info)
.current
URL aufgelöst werden muss, sondern beispielsweise die URL, zu der ein Benutzer umleiten wird? Was ist ein allgemeinerer Weg, um dies zu erreichen? Die Antwort von Conley Owens hat eine Ahnung, aber ich würde das Rad lieber nicht neu erfinden, wenn das Rad bereits in Django unter der Motorhaube existiert.Ab Django 1.5 kann über das Anforderungsobjekt darauf zugegriffen werden
https://docs.djangoproject.com/de/dev/ref/request-response/#django.http.HttpRequest.resolver_match
quelle
AttributeError: 'WSGIRequest' object has no attribute 'resolver_match'
.view_name
Wenn Sie den Namespace benötigenFür diejenigen, die ihre URL-Muster mit einem Namespace versehen, ist der Namespace-URL-Name der Anforderung möglicherweise von Interesse. In diesem Fall nannte es Django
view_name
stattdessen.quelle
urls.py
@ dariusz-niespodziany sofortreverse
verfügbar. Wenn Sie jedoch einen Namespace verwenden, kann dieserresolver_match.url_name
nicht direktreverse
verwendet werden. Sie müssen den Namespace also selbst anhängen. Anstatt es selbst zu tun, hat Django die.view_name
Initialisierung bereits festgelegt .Dies kann erreicht werden über:
Django> 1,8
quelle
Klärung der Frage: "Wie erhalten Sie in einer Ansicht den Namen eines URL-Musters, das darauf verweist, vorausgesetzt, es gibt genau ein solches URL-Muster."
Dies kann aus den genannten Gründen wünschenswert sein: Innerhalb der Ansicht möchten wir eine TROCKENE Methode, um eine URL in dieselbe Ansicht zu bringen (wir möchten nicht unseren eigenen URL-Musternamen kennen müssen).
Kurze Antwort: Es ist nicht einfach genug, Ihre Klasse zu unterrichten, aber es könnte eine lustige Sache für Sie sein, in ein oder zwei Stunden zu tun und sich auf GitHub zu übergeben.
Wenn Sie dies wirklich tun wollten, müssten Sie RegexURLResolver in eine Unterklasse unterteilen und die Auflösungsmethode ändern, um das übereinstimmende Muster (von dem Sie den Musternamen erhalten können) anstelle der Paare Ansicht und Schlüsselwort / Wert zurückzugeben. http://code.djangoproject.com/browser/django/trunk/django/core/urlresolvers.py#L142
Sie können dann einen Dekorateur oder eine geeignetere Middleware erstellen, die diese Unterklasse verwendet, um den Musternamen abzurufen und diesen Wert irgendwo in der Anforderung zu speichern, damit Ansichten ihn verwenden können.
Wenn Sie das tatsächlich wollen und auf Probleme stoßen, lassen Sie es mich wissen und ich kann Ihnen wahrscheinlich helfen.
Für Ihre Klasse würde ich sie einfach den Musternamen in der Ansicht oder Vorlage fest codieren lassen. Ich glaube, das ist der akzeptable Weg, dies zu tun.
Update: Je mehr ich darüber nachdenke, desto mehr würde ich davon abhalten, einen URL-Musternamen in einer Ansicht zu erhalten. URL-Muster-Parameter sind ziemlich unabhängig von den Parametern der Ansicht, auf die sie zeigen. Wenn Sie auf eine bestimmte URL verweisen möchten, müssen Sie wissen, wie das URL-Muster funktioniert und nicht nur, wie die Ansicht funktioniert. Wenn Sie wissen möchten, wie das URL-Muster funktioniert, müssen Sie möglicherweise auch den Namen des URL-Musters kennen.
quelle
http://docs.djangoproject.com/de/dev/ref/request-response/#django.http.HttpRequest.get_full_path
quelle
Ihre Frage ist etwas unklar, aber http://docs.djangoproject.com/en/dev/topics/http/urls/ wird wahrscheinlich eine Erklärung dafür liefern, wonach Sie suchen.
Besonders nützlich, um festzustellen, wie Django Anfragen verarbeitet:
Wenn ein Benutzer eine Seite von Ihrer Django-basierten Site anfordert, ist dies der Algorithmus, dem das System folgt, um zu bestimmen, welcher Python-Code ausgeführt werden soll:
Wenn Sie kurz nach dem vollständigen Pfad sind, können Sie Folgendes versuchen:
http://docs.djangoproject.com/de/dev/ref/request-response/#django.http.HttpRequest.get_full_path
Ich hoffe, das hilft - es zeigt an, wie das URLconf-Modul verwendet wird, und hilft Ihnen hoffentlich dabei, in die richtige Richtung zu weisen.
quelle
Versuche es einfach
request.path
. Dadurch wird der aktuelle Pfad angefordert.quelle