Wenn ich manchmal Django-Code lese, sehe ich in einigen Vorlagen reverse()
. Ich bin nicht ganz sicher, was das ist, aber es wird zusammen mit HttpResponseRedirect verwendet. Wie und wann reverse()
soll das verwendet werden?
Es wäre schön, wenn jemand eine Antwort mit einigen Beispielen geben würde ...
url--> view name
. Aber manchmal, wie bei der Umleitung, müssen Sie in die umgekehrte Richtung gehen und Django den Namen einer Ansicht geben, und Django generiert die entsprechende URL. Mit anderen Wortenview name --> url
. Das heißtreverse()
(es ist die Umkehrung der URL-Funktion). Es mag transparenter erscheinen, es einfach zu nennen,generateUrlFromViewName
aber das ist zu lang und wahrscheinlich nicht allgemein genug: docs.djangoproject.com/de/dev/topics/http/urls/…Antworten:
reverse()
| Django-DokumentationNehmen wir an,
urls.py
Sie haben dies in Ihrem definiert:In einer Vorlage können Sie dann auf diese URL verweisen als:
Dies wird wie folgt gerendert:
Angenommen, Sie möchten etwas Ähnliches in Ihrem tun
views.py
- z. B. Sie behandeln eine andere URL (nicht/foo/
) in einer anderen Ansicht (nichtsome_view
) und möchten den Benutzer umleiten/foo/
(häufig bei erfolgreicher Formularübermittlung).Sie könnten einfach tun:
Aber was ist, wenn Sie die URL in Zukunft ändern möchten? Sie müssten Ihre
urls.py
und alle Verweise darauf in Ihrem Code aktualisieren . Dies verstößt gegen DRY (Don't Repeat Yourself) , die ganze Idee, nur einen Ort zu bearbeiten, was etwas ist, nach dem man streben muss.Stattdessen können Sie sagen:
Dies durchsucht alle in Ihrem Projekt definierten URLs nach der mit dem Namen definierten URL
url_name
und gibt die tatsächliche URL zurück/foo/
.Dies bedeutet, dass Sie auf die URL nur anhand ihres
name
Attributs verweisen. Wenn Sie die URL selbst oder die Ansicht, auf die sie verweist, ändern möchten, können Sie dies tun, indem Sie nur eine Stelle bearbeitenurls.py
.quelle
{{ url 'url_name' }}
sollte{% url url_name %}
in Django 1.4 oder früher sein. Dies wird sich in der nächsten Django-Version (1.5) ändern und sollte es dann sein{% url 'url_name' %}
. Die Dokumente für das URL-Templatetag geben einige gute Informationen, wenn Sie ein wenig nach unten zum Abschnitt "Vorwärtskompatibilität"url_reverse
. Der beste Weg, mit solchen Kuriositäten umzugehen, besteht darin, sich zu weigern, sie zu benutzen.Dies ist eine alte Frage, aber hier ist etwas, das jemandem helfen könnte.
Aus den offiziellen Dokumenten:
Z.B. in Vorlagen (URL-Tag)
Z.B. im Python-Code (mit der
reverse
Funktion)quelle
Bestehende Antworten haben großartige Arbeit geleistet, um zu erklären, was diese
reverse()
Funktion in Django ist.Ich hatte jedoch gehofft, dass meine Antwort ein anderes Licht auf das Warum werfen würde : Warum
reverse()
anstelle von anderen einfacheren, wohl pythonischeren Ansätzen beim Binden von Vorlagenansichten und was sind einige legitime Gründe für die Popularität dieser "Weiterleitung über"reverse()
Muster "in der Django-Routing-Logik.Ein wesentlicher Vorteil ist die umgekehrte Konstruktion einer URL, wie andere bereits erwähnt haben. Genau so, wie Sie
{% url "profile" profile.id %}
die URL aus der URL-Konfigurationsdatei Ihrer App generieren würden : zpath('<int:profile.id>/profile', views.profile, name="profile")
.Wie das OP jedoch festgestellt hat, wird die Verwendung von
reverse()
üblicherweise auch mit der Verwendung von kombiniertHttpResponseRedirect
. Aber wieso?Beachten Sie Folgendes
views.py
:Und unser Minimum
urls.py
:In der
vote()
Funktion wird der Code in unseremelse
Blockreverse
zusammen mitHttpResponseRedirect
dem folgenden Muster verwendet:Dies bedeutet in erster Linie, dass wir die URL nicht fest codieren müssen (im Einklang mit dem DRY-Prinzip), sondern vor allem
reverse()
eine elegante Möglichkeit zumargs=(question.id)
Erstellen von URL-Zeichenfolgen bietet, indem Werte behandelt werden, die aus den Argumenten entpackt wurden ( wird von URLConfig behandelt). Angenommen, esquestion
gibt ein Attribut,id
das den Wert enthält5
. Die daraus erstellte URLreverse()
lautet dann:In normalem Bindungscode für Vorlagenansichten verwenden wir
HttpResponse()
oderrender()
da diese normalerweise weniger Abstraktion beinhalten: Eine Ansichtsfunktion gibt eine Vorlage zurück:In vielen legitimen Fällen der Umleitung ist es uns jedoch in der Regel wichtig, die URL aus einer Liste von Parametern zu erstellen. Dazu gehören Fälle wie:
POST
AnfrageBei den meisten handelt es sich um eine Umleitung und eine URL, die aus einer Reihe von Parametern besteht. Hoffe, dies ergänzt den bereits hilfreichen Thread der Antworten!
quelle
Die Funktion unterstützt das Trockenprinzip - stellt sicher, dass Sie keine URLs in Ihrer App fest codieren. Eine URL sollte an einem Ort und nur an einem Ort definiert werden - Ihre URL conf. Danach verweisen Sie wirklich nur noch auf diese Informationen.
Verwenden
reverse()
Sie diese Option, um die URL einer Seite anzugeben, entweder den Pfad zur Ansicht oder den Parameter page_name aus Ihrer URL conf. Sie würden es in Fällen verwenden, in denen es keinen Sinn macht, es in der Vorlage mit zu tun{% url 'my-page' %}
.Es gibt viele mögliche Stellen, an denen Sie diese Funktionalität verwenden können. Ich habe festgestellt, dass ich es verwende, wenn Benutzer in einer Ansicht umgeleitet werden (häufig nach der erfolgreichen Verarbeitung eines Formulars).
return HttpResponseRedirect(reverse('thanks-we-got-your-form-page'))
Sie können es auch beim Schreiben von Vorlagen-Tags verwenden.
Ein anderes Mal habe ich
reverse()
mit Modellvererbung gearbeitet. Ich hatte eine ListView für ein übergeordnetes Modell, wollte aber von einem dieser übergeordneten Objekte zur Detailansicht des zugehörigen untergeordneten Objekts gelangen. Ichget__child_url()
habe dem Elternteil eine Funktion angehängt , die die Existenz eines Kindes identifiziert und die URL seiner Detailansicht mit zurückgegeben hatreverse()
.quelle
Dafür gibt es ein Dokument
https://docs.djangoproject.com/de/dev/topics/http/urls/#reverse-resolution-of-urls
Es kann verwendet werden, um eine URL für eine bestimmte Ansicht zu generieren
Hauptvorteil ist, dass Sie keine harten Coderouten in Ihrem Code verwenden.
quelle
Die vorhandenen Antworten sind ziemlich klar. Nur für den Fall, dass Sie nicht wissen, warum es aufgerufen wird
reverse
: Es wird ein URL-Name eingegeben und die tatsächliche URL angegeben. Dies ist umgekehrt, wenn Sie zuerst eine URL haben und dann einen Namen vergeben.quelle
Mit reverse () wird das Django DRY-Prinzip eingehalten. Wenn Sie also die URL in Zukunft ändern, können Sie diese URL mit reverse (urlname) referenzieren.
quelle