Le risposte esistenti fatto un ottimo lavoro a spiegare la cosa di questa reverse()funzione nel Django.
Tuttavia, speravo che la mia risposta gettasse una luce diversa sul perché : perché usare reverse()al posto di altri approcci più semplici, probabilmente più pitonici nel binding della vista template, e quali sono alcuni motivi legittimi per la popolarità di questo "reindirizzamento via reverse() pattern "nella logica di routing di Django.
Un vantaggio chiave è la costruzione inversa di un url, come altri hanno già detto. Proprio come utilizzeresti {% url "profile" profile.id %}per generare l'URL dal file di configurazione dell'URL della tua app: ad es path('<int:profile.id>/profile', views.profile, name="profile").
Ma come hanno notato gli OP, l'uso di reverse()è anche comunemente combinato con l'uso di HttpResponseRedirect. Ma perché?
Non sono del tutto sicuro di cosa si tratti, ma viene utilizzato insieme a HttpResponseRedirect. Come e quando dovrebbe essere usato questo reverse ()?
Considera quanto segue 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)
))
E il nostro minimo 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')
]
Nella vote()funzione, il codice nel nostro elseblocco utilizza reverseinsieme HttpResponseRedirectal seguente modello:
HttpResponseRedirect(reverse('polls:polls-results',
args=(question.id)
In primo luogo, ciò significa che non è necessario codificare l'URL (coerentemente con il principio DRY), ma soprattutto, reverse()fornisce un modo elegante per costruire stringhe URL gestendo i valori decompressi dagli argomenti ( args=(question.id)è gestito da URLConfig). Supponiamo che questionabbia un attributo idche contenga il valore 5, l'URL creato da reverse()sarebbe quindi:
'/polls/5/results/'
Nel normale codice di associazione vista modello, utilizziamo HttpResponse()o render()poiché in genere comportano meno astrazioni: una funzione vista che restituisce un modello:
def index(request):
return render(request, 'polls/index.html')
Ma in molti casi legittimi di reindirizzamento, in genere ci preoccupiamo di costruire l'URL da un elenco di parametri. Questi includono casi come:
- Invio di moduli HTML tramite
POSTrichiesta
- Post-convalida del login utente
- Reimpostazione della password tramite token Web JSON
La maggior parte di questi comporta una qualche forma di reindirizzamento e un URL creato attraverso una serie di parametri. Spero che questo si aggiunga al già utile thread di risposte!
url--> view name. Ma a volte, come durante il reindirizzamento, è necessario andare nella direzione opposta e dare a Django il nome di una vista e Django genera l'URL appropriato. In altre parole,view name --> url. Cioè,reverse()(è il contrario della funzione url). Potrebbe sembrare più trasparente chiamarlo,generateUrlFromViewNamema è troppo lungo e probabilmente non abbastanza generale: docs.djangoproject.com/en/dev/topics/http/urls/…