djangoでnoReverseMatchエラーが出たけど、対処方法が分からない。
この記事はそのような方に向けて作りました。
NoReverseMatchエラーってそもそも何?
まず、NoReverseMatchエラーについて理解していきましょう。
このエラーを理解するためには、まずReverseについて理解していることが好ましいです。
Reverseの概要については、reverseの考え方について分かりやすく解説【具体的に説明します】という記事や、reverseの使い方について分かりやすく解説【具体的なコード付き】という記事を参考にしてみて下さい。
NoReverseMatchエラーは、提供されたパラメータをもとにviewを呼び出そうとした一方、パラーメータに合うviewがなかったことからエラーになってしまったというものです。
この前提をもとに、エラーの対処方法について学んでいきましょう。
urlpatternを確認
まずは、reverseで指定したパラメーターとurlpattenrが合致しているかを確認していきましょう。
例えば、reverseが以下のようなコードだったとします。
コードreverse('home')
その上で、urlpatternsをみていきましょう。
コードurlpatterns = [
path('homepage/', homefunction, name='home2')
]
このように、name='home2'となっている場合は、homeとhome2が合致しないのでエラーが出てしまいます。
引数がある場合に注意
また、NoReverseMatchエラーが発生する原因の一つとして、引数を適切に与えていないということが挙げられます。
例えば、以下のようなurlpatternがあったとしましょう。
urlpatterns = [
path('homepage/<int:pk>', homefunction, name='home2')
] [/python]
これは、urlに引数としてprimary keyを取るように設定しているものです。
このurlに引数を持たせるということが良くわからないという方は、urlpatternの使い方を詳しく解説【保存版】という記事を参考にしてください。
この時、reverseを使うためには、引数を設定しなければいけません。具体的には、以下のような形でコードを書いていく必要があります。
コードreverse('home', args=[pk] )
また、キーワード引数を取ることもできます。
コードreverse('home', kargs={'pk':pk} )
ここでのpkというのは、呼び出したモデルの中に入っているデータのprimary keyのことです。
アプリの名前を指定している場合も注意
また、アプリの名前を指定している場合も注意が必要です。
例えば、some_appというアプリ名を指定している場合、このアプリのurlを指定して呼び出すために、以下のような指定をしなければいけません。
コードreverse('some_app:home', args=[pk] )
意外と忘れがちな部分でもありますので、頭の片隅にいれておくと良いでしょう。
NoReverseMatchエラーのまとめ
(1) まずはurlpatternを確認
(2) 次に引数を確認
(3) 最後にアプリの名前を確認