[Django]NoReverseMatch ‘hoge’ is not a valid view function or pattern name.とエラーが出た時の確認事項
DjangoでNoReverseMatchエラーに遭遇した時の対処方法について。
初めてDjangoアプリケーションを作成した時はよく遭遇するエラーでしたが、最近見てないなと思っていたらまた遭遇したので備忘録を兼ねてメモ。
NoReverseMatchエラーは大体、記述ミスが多い
大体、アプリケーションのurls.pyの記述をミスしていることから起こるエラーです。
スペルミスなどを注意深く観察していくとエラーは解消されると思います。
しかし、今回明らかに記述ミスはないだろうという場面でエラーが出てしまいました。
app_nameの記述を追加してエラーが発生
(かなりマイナーな再現だと思いますが)
今まで問題なく動作していたのですが、ページに遷移するとNoReverseMatchエラーが発生。
原因は明らかにアプリケーションの urls.pyに
app_name = 'hogeapp'
app_nameを追加したことが原因でした。ちなみにapp_nameを削除すると問題なく動作するという。
app_nameを記述して、templatesに{% url %}のテンプレートタグを記述したurlが正常に動作していないようでした。
ちなみにDjangoGirlsを参考にタグ周りを実装していたので、同じようにエラーに遭遇した人もいるかもしれません。
DjngoGirlsで紹介されている記述を修正
DjangoGirlsではurlタグは以下のように記載されています。
<h1><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h1>
これはインデックスページから詳細ページに遷移するというものです。
そして、DjangoGirlsではプロジェクトにurls.pyからアプリケーション(blog)のurls.pyを読み込んでいます。そしてblogアプリケーションのurls.pyにapp_nameを記載しません。動くことは動くのですが、DjangoGirlsのurlタグの書き方でapp_nameを定義すると本題のReverseMatchエラーが発生します。
app_nameをurls.pyに記述した場合はurlタグを以下のように記述します。
<h1><a href="{% url 'appname:post_detail' pk=post.pk %}">{{ post.title }}</a></h1>
appnameの箇所にはapp_name = ”で記述した右側の部分が入ります。
post_detailの部分はurls.pyで記述したname=”の箇所ですね。
Django1.1ではapp_nameの定義は必要なく、他の記述で代替できたそうですが、Django2系からはapp_nameの定義が推奨されるようなので記述した方が良いでしょう。
もし、同じようなエラーに遭遇した人はテンプレートファイルのurlタグを確認してみてください。