Ketika saya membaca kode Django kadang-kadang, saya melihat di beberapa template reverse()
. Saya tidak yakin apa ini, tetapi digunakan bersama dengan HttpResponseRedirect. Bagaimana dan kapan ini reverse()
seharusnya digunakan?
Alangkah baiknya jika seseorang memberi jawaban dengan beberapa contoh ...
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/…Jawaban:
reverse()
| Dokumentasi DjangoMisalkan dalam diri Anda,
urls.py
Anda telah mendefinisikan ini:Di templat Anda dapat merujuk ke url ini sebagai:
Ini akan diterjemahkan sebagai:
Sekarang katakan Anda ingin melakukan sesuatu yang serupa di Anda
views.py
- misalnya Anda sedang menangani beberapa url lain (tidak/foo/
) dalam beberapa tampilan lain (tidaksome_view
) dan Anda ingin mengarahkan pengguna ke/foo/
(sering kali pada pengiriman formulir yang berhasil).Anda bisa melakukannya:
Tetapi bagaimana jika Anda ingin mengubah url di masa depan? Anda harus memperbarui
urls.py
dan semua referensi Anda ke dalam kode Anda. Ini melanggar KERING (Jangan Ulangi Diri Sendiri) , seluruh ide untuk mengedit satu tempat saja, yang merupakan sesuatu untuk diperjuangkan.Sebaliknya, Anda bisa mengatakan:
Ini memeriksa semua url yang ditentukan dalam proyek Anda untuk url yang ditentukan dengan nama
url_name
dan mengembalikan url yang sebenarnya/foo/
.Ini berarti bahwa Anda merujuk ke url hanya dengan
name
atributnya - jika Anda ingin mengubah url itu sendiri atau tampilan yang merujuknya Anda dapat melakukan ini dengan mengedit satu tempat saja -urls.py
.sumber
{{ url 'url_name' }}
harus{% url url_name %}
di Django 1.4 atau lebih awal. Ini akan berubah dalam rilis Django berikutnya (1,5) dan seharusnya{% url 'url_name' %}
. Dokumen untuk templatetag url memberikan beberapa info bagus jika Anda gulirkan sedikit ke bagian "kompatibilitas ke depan"url_reverse
. Cara terbaik untuk menghadapi keanehan semacam ini adalah dengan menolak menggunakannya.Ini adalah pertanyaan lama, tapi di sini ada sesuatu yang mungkin bisa membantu seseorang.
Dari dokumen resmi:
Misalnya. dalam templat (tag url)
Misalnya. dalam kode python (menggunakan
reverse
fungsi)sumber
Jawaban yang ada sangat membantu dalam menjelaskan apa
reverse()
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 inireverse()
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: mispath('<int:profile.id>/profile', views.profile, name="profile")
.Tetapi seperti yang telah dicatat OP, penggunaan
reverse()
juga biasanya dikombinasikan dengan penggunaanHttpResponseRedirect
. Tapi kenapa?Pertimbangkan yang berikut ini
views.py
:Dan minimal kami
urls.py
:Dalam
vote()
fungsinya, kode dielse
blok kami digunakanreverse
bersama denganHttpResponseRedirect
dalam pola berikut: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). Misalkanquestion
memiliki atributid
yang berisi nilai5
, URL yang dibangun dari itureverse()
akan menjadi:Dalam kode pengikatan tampilan templat normal, kami menggunakan
HttpResponse()
ataurender()
karena biasanya melibatkan lebih sedikit abstraksi: satu fungsi tampilan mengembalikan satu templat:Namun dalam banyak kasus pengalihan yang sah, kami biasanya peduli tentang pembuatan URL dari daftar parameter. Ini termasuk kasus-kasus seperti:
POST
permintaanSebagian besar melibatkan beberapa bentuk pengalihan, dan URL dibangun melalui serangkaian parameter. Semoga ini menambah utas jawaban yang sudah membantu!
sumber
Fungsi ini mendukung prinsip kering - memastikan Anda tidak membuat url kode yang sulit di seluruh aplikasi Anda. Sebuah url harus didefinisikan di satu tempat, dan hanya satu tempat - url conf Anda. Setelah itu Anda benar-benar hanya mereferensikan info itu.
Gunakan
reverse()
untuk memberi Anda url suatu halaman, diberikan path ke view, atau parameter page_name dari conf url Anda. Anda akan menggunakannya dalam kasus di mana tidak masuk akal untuk melakukannya di template dengan{% url 'my-page' %}
.Ada banyak tempat yang memungkinkan Anda menggunakan fungsi ini. Satu tempat yang saya temukan saya gunakan adalah ketika mengarahkan pengguna dalam tampilan (seringkali setelah pemrosesan formulir berhasil) -
return HttpResponseRedirect(reverse('thanks-we-got-your-form-page'))
Anda juga dapat menggunakannya saat menulis tag templat.
Waktu lain yang saya gunakan
reverse()
adalah dengan pewarisan model. Saya memiliki ListView pada model induk, tetapi ingin mendapatkan dari salah satu objek induk tersebut ke DetailView dari objek anak terkait. Saya melampirkanget__child_url()
fungsi ke orang tua yang mengidentifikasi keberadaan anak dan mengembalikan url menggunakan DetailView itureverse()
.sumber
Ada dokumen untuk itu
https://docs.djangoproject.com/en/dev/topics/http/urls/#reverse-resolution-of-urls
itu dapat digunakan untuk menghasilkan URL untuk tampilan yang diberikan
Keuntungan utama adalah Anda tidak membuat rute kode yang sulit dalam kode Anda.
sumber
Jawaban yang ada cukup jelas. Kalau-kalau Anda tidak tahu mengapa itu disebut
reverse
: Dibutuhkan input dari nama url dan memberikan url yang sebenarnya, yang terbalik dengan memiliki url pertama dan kemudian memberikannya nama.sumber
Reverse () digunakan untuk mematuhi prinsip DRY django yaitu jika Anda mengubah url di masa depan maka Anda dapat mereferensikan url tersebut menggunakan reverse (urlname).
sumber