Apa itu kesalahan NoReverseMatch, dan bagaimana cara memperbaikinya?

119

Saya memiliki beberapa kode dan ketika dijalankan, itu melontarkan NoReverseMatch, mengatakan:

NoReverseMatch di / my_url / Reverse untuk 'my_url_name' dengan argumen '()' dan argumen kata kunci '{}' tidak ditemukan. n pola mencoba: []

Apa artinya ini, dan apa yang dapat saya lakukan?

Ucapkan se
sumber

Jawaban:

243

The NoReverseMatchkesalahan mengatakan bahwa Django tidak dapat menemukan pola url yang cocok untuk url yang Anda berikan di setiap url aplikasi diinstal Anda.

Pengecualian NoReverseMatch dimunculkan oleh django.core.urlresolvers ketika URL yang cocok di URLconf Anda tidak dapat diidentifikasi berdasarkan parameter yang disediakan.

Untuk mulai men-debugnya, Anda harus memulai dengan menonaktifkan pesan kesalahan yang diberikan kepada Anda.

  • NoReverseMatch di / my_url /

    Ini adalah url yang sedang dirender, url inilah yang saat ini coba diakses aplikasi Anda, tetapi berisi url yang tidak dapat dicocokkan

  • Terbalik untuk 'my_url_name'

    Ini adalah nama url yang tidak dapat ditemukan

  • dengan argumen '()' dan

    Ini adalah argumen non-kata kunci yang diberikannya ke url

  • argumen kata kunci '{}' tidak ditemukan.

    Ini adalah argumen kata kunci yang diberikannya ke url

  • n pola mencoba: []

    Ini adalah pola yang dapat ditemukannya di file urls.py Anda yang dicoba untuk dicocokkan

Mulailah dengan menemukan kode di sumber Anda yang relevan dengan url yang saat ini sedang dirender - url, tampilan, dan template apa pun yang terlibat. Dalam kebanyakan kasus, ini akan menjadi bagian dari kode yang sedang Anda kembangkan.

Setelah Anda selesai melakukannya, baca kode dengan urutan yang diikuti oleh django sampai Anda mencapai baris kode yang mencoba membuat url untuk Anda my_url_name. Sekali lagi, ini mungkin di tempat yang baru saja Anda ubah.

Sekarang Anda telah menemukan di mana kesalahan itu terjadi, gunakan bagian lain dari pesan kesalahan untuk menyelesaikan masalah.

Nama url

  • Apakah ada kesalahan ketik?
  • Sudahkah Anda memberikan url yang Anda coba untuk mengakses nama yang diberikan?
  • Jika Anda telah menyetel app_name di aplikasi urls.py(misalnya app_name = 'my_app') atau jika Anda menyertakan aplikasi dengan namespace (misalnya include('myapp.urls', namespace='myapp'), Anda perlu menyertakan namespace saat membalik, misalnya {% url 'myapp:my_url_name' %}atau reverse('myapp:my_url_name').

Argumen dan Argumen Kata Kunci

Argumen dan argumen kata kunci digunakan untuk mencocokkan dengan grup tangkapan apa pun yang ada dalam url tertentu yang dapat diidentifikasi dengan ()tanda kurung di sekitarnya dalam pola url.

Dengan asumsi url yang Anda cocokkan membutuhkan argumen tambahan, lihat di pesan kesalahan dan pertama-tama lihat apakah nilai untuk argumen yang diberikan terlihat benar.

Jika tidak benar:

  • Nilainya hilang atau string kosong

    Ini biasanya berarti bahwa nilai yang Anda berikan tidak berisi nilai yang Anda harapkan. Lihatlah di mana Anda menetapkan nilai untuknya, menetapkan breakpoint, dan Anda harus mencari tahu mengapa nilai ini tidak diteruskan dengan benar.

  • Argumen kata kunci salah ketik

    Perbaiki ini baik di pola url, atau di url yang Anda buat.

Jika benar:

  • Debug regex

    Anda dapat menggunakan situs web seperti regexr untuk segera menguji apakah pola Anda cocok dengan url yang Anda pikir Anda buat, Salin pola url ke dalam bidang regex di bagian atas, lalu gunakan area teks untuk menyertakan url apa pun yang menurut Anda itu harus cocok dengan.

    Kesalahan Umum:

    • Pencocokan dengan karakter .wild card atau karakter regex lainnya

      Ingatlah untuk meloloskan diri dari karakter tertentu dengan \awalan

    • Hanya cocok dengan karakter huruf kecil / besar

      Coba gunakan salah satu a-Zatau \walih-alih a-zatauA-Z

  • Periksa bahwa pola yang Anda cocokkan termasuk dalam pola yang dicoba

    Jika tidak ada di sini, kemungkinan Anda lupa menyertakan aplikasi Anda dalam INSTALLED_APPSpengaturan (atau urutan aplikasi di dalamnya INSTALLED_APPSmungkin perlu dilihat)

Versi Django

Dalam Django 1.10, kemampuan untuk membalikkan url dengan jalur pythonnya telah dihapus. Jalur bernama harus digunakan sebagai gantinya.


Jika Anda masih tidak dapat melacak masalahnya, silakan ajukan pertanyaan baru yang mencakup apa yang telah Anda coba, apa yang telah Anda teliti (Anda dapat menautkan ke pertanyaan ini), dan kemudian memasukkan kode yang relevan ke masalah - url yang Anda cocokkan, pola url apa pun yang relevan, bagian dari pesan kesalahan yang menunjukkan apa yang django coba cocokkan, dan mungkin INSTALLED_APPSpengaturannya jika berlaku.

Sayse
sumber
11
Akhirnya kami memiliki jawaban kanonik yang dapat kami berikan sebagai target dup
e4c5
bisakah Anda menjelaskan tentang jalur bernama di django 1.10?
sage poudel
2
Ya, set app_name in the app's urls.py (e.g. app_name = 'my_app') intinya
CK
Saya menemukan penguji regex langsung ini lebih bermanfaat: regex101.com
obotezat
Terima kasih untuk tutorial luar biasa ini di NoReverseMatch! Saya bisa menyelesaikan masalah saya.
newmachines_xyz