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 : z path('<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 kombiniert HttpResponseRedirect. Aber wieso?
Ich bin nicht ganz sicher, was das ist, aber es wird zusammen mit HttpResponseRedirect verwendet. Wie und wann soll dieses reverse () verwendet werden?
Beachten Sie Folgendes views.py:
from django.http import HttpResponseRedirect
from django.urls import reverse
def vote(request, question_id):
question = get_object_or_404(Question, pk=question_id)
try:
selected = question.choice_set.get(pk=request.POST['choice'])
except KeyError:
# handle exception
pass
else:
selected.votes += 1
selected.save()
return HttpResponseRedirect(reverse('polls:polls-results',
args=(question.id)
))
Und unser Minimum urls.py:
from django.urls import path
from . import views
app_name = 'polls'
urlpatterns = [
path('<int:question_id>/results/', views.results, name='polls-results'),
path('<int:question_id>/vote/', views.vote, name='polls-vote')
]
In der vote()Funktion wird der Code in unserem elseBlock reversezusammen mit HttpResponseRedirectdem folgenden Muster verwendet:
HttpResponseRedirect(reverse('polls:polls-results',
args=(question.id)
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 zum args=(question.id)Erstellen von URL-Zeichenfolgen bietet, indem Werte behandelt werden, die aus den Argumenten entpackt wurden ( wird von URLConfig behandelt). Angenommen, es questiongibt ein Attribut, iddas den Wert enthält 5. Die daraus erstellte URL reverse()lautet dann:
'/polls/5/results/'
In normalem Bindungscode für Vorlagenansichten verwenden wir HttpResponse()oder render()da diese normalerweise weniger Abstraktion beinhalten: Eine Ansichtsfunktion gibt eine Vorlage zurück:
def index(request):
return render(request, 'polls/index.html')
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:
- Übermittlung des HTML-Formulars auf
POSTAnfrage
- Benutzeranmeldung nach Validierung
- Setzen Sie das Passwort über JSON-Web-Token zurück
Bei 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!
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,generateUrlFromViewNameaber das ist zu lang und wahrscheinlich nicht allgemein genug: docs.djangoproject.com/de/dev/topics/http/urls/…