Djangoで NoReverseMatch, XXX is not a registered namespaceのエラー

注意: この記事を書いているのはDjangoの超初心者です。分かっていないところが多々あります。
以下を読む際は、不正確な記述が含まれている可能性があることを考慮してください。


Djangoで NoReverseMatch, XXX is not a registered namespaceというエラーが出たときの対処法。

Djangoでformを作った。 formの中身は今回関係ないので、何でもよい。 例えば、公式ドキュメントのはじめての Django アプリ作成、その 4 | Django ドキュメント | Djangoを改変した例を書いておく。

sample.html

<form action="{% url 'sample_app:vote' question.id %}" method="post"> 
    (中略)
</form>

python manage.py runserverとサーバーを起動して、上記のsample.htmlに対応するページのURLを入力する。
ブラウザに出てきたエラーメッセージは次のとおり。

NoReverseMatch at /(URLのパス)/
'sample_app' is not a registered namespace

NoReverseMatchというエラーの中にはいくつか種類があって、 その中でもXXX is not a registered namespaceというエラーである。

まずフォルダ名を確認した。確かに「sample_app」で、スペル間違いは無かった。 スペル間違いが原因ではないなら、これは(エラーメッセージの通りだが)名前空間にアプリケーション名を登録していないのが問題である。


色々検索したところ、解決法は2つあるようだが、自分の環境で上手くいったのは1つの方法だけだった。

解決法はアプリケーションの中にapp_nameを指定すること

アプリケーションの urls.pyに app_name= 'sample_app' を書き加える。

djangoの公式チュートリアルでもこの方法が記載してある。
はじめての Django アプリ作成、その 3 | Django ドキュメント | Django
「URL 名の名前空間」という、そのものズバリのセクションで説明している。

もう一つの解決法? pathをincludeするときにnamespaceキーワードを指定する

プロジェクトの urls.pyの中で、includeするときにnamespaceを指定する

python - Django - is not a registered namespace - Stack Overflowのベストアンサーなどで書かれている方法だ。

urls.pyの中で

    path('(URLのパス)', include('sample_app.urls' , namespace='sample_app')),

namespace='sample_app'を追加すればよいと書いてある。

しかしこの方法では上手くいかなかった。実行すると、コンソール上でこんなエラーが出てきた。

    'Specifying a namespace in include() without providing an app_name '
django.core.exceptions.ImproperlyConfigured: Specifying a namespace in include() without providing an app_name is not supported. Set the app_name attribute in the included module, or pass a 2-tuple containing the list of patterns and app_name instead.

app_nameを指定していないのに、includeの中でnamespaceを指定するのはダメ、らしい。
うーん。よく分からない。

参考URL

https://stackoverflow.com/questions/41883254/django-is-not-a-registered-namespace/51343021 https://stackoverflow.com/questions/38390177/what-is-a-noreversematch-error-and-how-do-i-fix-it ベストアンサーが、NoReverseMatch全般に関してまとまったアドバイスを書いているので参考になる。