urls.py で、include() に namespace を追加したらエラーで実行できない
件名の件で調べたら以下のサイトを見つけることができました。感謝です。
目次
環境
Ubuntu 18.04LTS Python 3.7.3 Django 2.2
やりたかったこと
名前空間を追加することによって、template(=html) 内でリンクを書くときに、全体でかぶらないように、一意に決めた長い名前ではなく、プレフィックス分け(=アプリ分け)した短い名前での指定をすることになります。
という知見を得たので、そりゃラクダ!と思って書いてみたところ、エラーを食らいました。
urlpatterns = [ path('admin/', admin.site.urls), path('polls/', include('polls.urls', namespace='polls')), ]
エラー内容
File "/~/urls.py", line 23, in <module> path('polls/', include('polls.urls', namespace='polls')), File "/~/conf.py", line 39, in include '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.
引用&和訳
django.core.exceptions.ImproperlyConfigured:app_nameを指定せずにinclude() で名前空間を指定することはサポートされていません。 インクルードモジュールでapp_name属性を設定するか、代わりにパターンとapp_nameのリストを含む2タプルを渡します。
英語、見てなかったんだけど、教えてくれてたのね・・・。
修正後
正しくは、「タプル形式で1つにまとめて書く」でした。
urlpatterns = [ path('admin/', admin.site.urls), path('polls/', include( ('polls.urls', 'polls') )), ]
追記
プロジェクト+アプリの以下の組み合わせでもいけるみたいです。
プロジェクト/urls.py
urlpatterns = [ path('admin/', admin.site.urls), path('polls/', include('polls.urls')), ]
アプリ/urls.py
app_name 変数?を割り当てるやり方
app_name = 'polls'
urlpatterns = [
~
]