伊達要一@とうきょうDD954の書棚と雑記

伊達要一の読んだ本の紹介と書評、それと雑記

【Python/Django】Djangoのurls.pyでinclude()を使うとnamespaceが指定できない問題の解決法(2018/02/10追記)

f:id:yohichidate:20170608155451p:plain
(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