Jawaban yang ada sangat membantu dalam menjelaskan apareverse()
fungsi ini di Django.
Namun, saya berharap bahwa jawaban saya memberi penjelasan berbeda tentang alasannya : mengapa digunakan reverse()
sebagai pengganti pendekatan yang lebih langsung, lebih bisa dibilang lebih pythonic dalam pengikatan tampilan templat, dan apa saja alasan sah untuk popularitas "redirect via ini reverse()
pola "dalam logika routing Django.
Salah satu manfaat utama adalah pembangunan terbalik dari url, seperti yang lain telah disebutkan. Seperti cara Anda menggunakan {% url "profile" profile.id %}
untuk menghasilkan url dari file konfigurasi url aplikasi Anda: mis path('<int:profile.id>/profile', views.profile, name="profile")
.
Tetapi seperti yang telah dicatat OP, penggunaan reverse()
juga biasanya dikombinasikan dengan penggunaan HttpResponseRedirect
. Tapi kenapa?
Saya tidak yakin apa ini, tetapi digunakan bersama dengan HttpResponseRedirect. Bagaimana dan kapan reverse ini () seharusnya digunakan?
Pertimbangkan yang berikut ini 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)
))
Dan minimal kami 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')
]
Dalam vote()
fungsinya, kode di else
blok kami digunakan reverse
bersama dengan HttpResponseRedirect
dalam pola berikut:
HttpResponseRedirect(reverse('polls:polls-results',
args=(question.id)
Ini yang pertama dan terutama, berarti kita tidak perlu melakukan hardcode URL (konsisten dengan prinsip KERING) tetapi yang lebih penting, reverse()
memberikan cara yang elegan untuk membangun string URL dengan menangani nilai yang dibongkar dari argumen ( args=(question.id)
ditangani oleh URLConfig). Misalkan question
memiliki atribut id
yang berisi nilai 5
, URL yang dibangun dari itu reverse()
akan menjadi:
'/polls/5/results/'
Dalam kode pengikatan tampilan templat normal, kami menggunakan HttpResponse()
atau render()
karena biasanya melibatkan lebih sedikit abstraksi: satu fungsi tampilan mengembalikan satu templat:
def index(request):
return render(request, 'polls/index.html')
Namun dalam banyak kasus pengalihan yang sah, kami biasanya peduli tentang pembuatan URL dari daftar parameter. Ini termasuk kasus-kasus seperti:
- Pengiriman formulir HTML melalui
POST
permintaan
- Validasi pasca masuk pengguna
- Setel ulang kata sandi melalui token web JSON
Sebagian besar melibatkan beberapa bentuk pengalihan, dan URL dibangun melalui serangkaian parameter. Semoga ini menambah utas jawaban yang sudah membantu!
url--> view name
,. Tetapi kadang-kadang, seperti saat mengarahkan, Anda harus pergi ke arah sebaliknya dan memberi Django nama tampilan, dan Django menghasilkan url yang sesuai. Dengan kata lainview name --> url
,. Yaitu,reverse()
(ini kebalikan dari fungsi url). Mungkin terlihat lebih transparan untuk menyebutnya sajagenerateUrlFromViewName
tapi itu terlalu lama dan mungkin tidak cukup umum: docs.djangoproject.com/en/dev/topics/http/urls/…