【Python/Django】Djangoのurls.pyでinclude()を使うとnamespaceが指定できない問題の解決法(2018/02/10追記)
(2018/02/10追記:Django の公式チュートリアルの記述してある実装方法を追記)
よく有るチュートリアルどおりに実装したのに、urls.pyのところでこんなエラーが出ることがあったり。
Specifying a namespace in django.conf.urls.include() without providing an app_name is deprecated. Set the app_name attribute in the included module, or pass a 2-tuple containing the list of patterns and app_name instead
昨日の更新でinclude()でnamespaceを実装せずに逃げたわけですが、解決法があった模様。
まずはこちらのサイトのパターン
teratail.com
どうやらDjangoの古いバージョンではプロジェクトのurls.pyで、include()にnamespaceを記述すればルーティングしてくれたらしいのですが、最近のバージョンでは不可になっているということのようでして。
これを解決するためには、アプリ側(要するに下記でいう 'appname' 側)のurls.pyにこいつを追加すればよい。
app_name = 'appname'
appnameの箇所には当該ディレクトリ名を指定すればOK。
別解としては、プロジェクトのurls.pyの記述方法をこのようにすればよい。
こちらのサイトを参考にしました。
mocabrown.com
urlpatterns = [ # ----------------NG----------------- # url(r'^hello/', include('hello.urls', namespace='hello')), # ----------------OK----------------- url(r'^hello/', include(('hello.urls','hello'),)), ]
namespaceが使えないなら使わずに記述するために、includeの第一引数の中にnamespaceにあたるものをまとめて記述してしまうという方法。
どちらが良いのかというのはちょっとなんとも言えないけども、個人的には後者の方が好みかも。
実際にこちらのチュートリアルに基づいて実装したら詰まったので、是非とも活用してやって欲しいと思っていたり。
(2018/02/10追記)
Django の公式ドキュメント を調べていると、上記2パターンのうち前者が公式っぽい。
URL ディスパッチャ | Django documentation | Django
以下、公式ドキュメントのソースを引用。
urls.py
from django.urls import include, path urlpatterns = [ path('author-polls/', include('polls.urls', namespace='author-polls')), path('publisher-polls/', include('polls.urls', namespace='publisher-polls')), ]
polls/urls.py
from django.urls import path from . import views app_name = 'polls' urlpatterns = [ path('', views.IndexView.as_view(), name='index'), path('<int:pk>/', views.DetailView.as_view(), name='detail'), ... ]
(2018/02/10追記ここまで)
他のナレッジについてはこちら。
yohichidate.hatenablog.com