Mevcut cevaplar, Django'daki bu fonksiyonun ne olduğunu açıklamakta çok başarılı oldu reverse()
.
Ancak, ben cevabım farklı bir ışık tutacak o umduğumuz neden : Kullanım neden reverse()
şablon görünümdeki diğer daha dolaysız, belki daha pythonic yaklaşımların yerine bağlayıcı, ve bu "yeniden yönlendirme popülaritesi için bazı meşru nedenleri nelerdir aracılığı reverse()
yönlendirme mantığında.
Bir diğer önemli fayda, diğerlerinin de belirttiği gibi, bir url'nin tersine yapılandırılmasıdır. Tıpkı {% url "profile" profile.id %}
uygulamanızın url yapılandırma dosyasından url'yi nasıl oluşturacağınız gibi : ör path('<int:profile.id>/profile', views.profile, name="profile")
.
Ancak OP'nin belirttiği gibi, kullanımı reverse()
da yaygın olarak kullanımı ile birleştirilir HttpResponseRedirect
. Ama neden?
Bunun ne olduğundan tam emin değilim ama HttpResponseRedirect ile birlikte kullanılıyor. Bu reverse () nasıl ve ne zaman kullanılacak?
Aşağıdakileri düşünün 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)
))
Ve minimalimiz 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')
]
İşlevde, vote()
bloğumuzdaki kod aşağıdaki desenle birlikte else
kullanır :reverse
HttpResponseRedirect
HttpResponseRedirect(reverse('polls:polls-results',
args=(question.id)
Bu ilk ve en önemlisi, URL'yi sabit kodlamak zorunda olmadığımız anlamına gelir (DRY ilkesine uygun), daha da önemlisi, reverse()
bağımsız değişkenlerden açılmış değerleri args=(question.id)
işleyerek ( URLConfig tarafından işlenir) URL dizeleri oluşturmak için zarif bir yol sağlar . Sözde değeri içeren question
bir özniteliği varsayalım, bundan oluşturulan URL :id
5
reverse()
'/polls/5/results/'
Normal şablon görünümü bağlama kodunda, HttpResponse()
veya render()
genellikle daha az soyutlamayı içerdiklerinden kullanırız : bir şablon döndüren bir görünüm işlevi:
def index(request):
return render(request, 'polls/index.html')
Ancak birçok yasal yeniden yönlendirme durumunda, tipik olarak URL'yi bir parametre listesinden oluşturmayı önemsiyoruz. Bunlar aşağıdakileri içerir:
POST
İstek yoluyla HTML formu gönderme
- Kullanıcı girişi doğrulama sonrası
- JSON web belirteçleriyle parolayı sıfırlayın
Bunların çoğu bir tür yönlendirme ve bir dizi parametre aracılığıyla oluşturulan bir URL içerir. Umarım bu zaten yararlı cevaplar iş parçacığı ekler!
url--> view name
,. Ancak bazen, yeniden yönlendirirken olduğu gibi, ters yöne gitmeniz ve Django'ya bir görünümün adını vermeniz gerekir ve Django uygun URL'yi oluşturur. Başka bir deyişleview name --> url
,. Yani,reverse()
(url işlevinin tersidir). Sadece aramak daha şeffaf görünebilir,generateUrlFromViewName
ancak bu çok uzun ve muhtemelen yeterince genel değil: docs.djangoproject.com/en/dev/topics/http/urls/…