Django 1.10にアップグレードした後、私はエラーが出ます:
TypeError: view must be a callable or a list/Tuple in the case of include().
私のurls.pyは次のとおりです。
from Django.conf.urls import include, url
urlpatterns = [
url(r'^$', 'myapp.views.home'),
url(r'^contact/$', 'myapp.views.contact'),
url(r'^login/$', 'Django.contrib.auth.views.login'),
]
完全なトレースバックは次のとおりです。
Traceback (most recent call last):
File "/Users/alasdair/.virtualenvs/Django110/lib/python2.7/site-packages/Django/utils/autoreload.py", line 226, in wrapper
fn(*args, **kwargs)
File "/Users/alasdair/.virtualenvs/Django110/lib/python2.7/site-packages/Django/core/management/commands/runserver.py", line 121, in inner_run
self.check(display_num_errors=True)
File "/Users/alasdair/.virtualenvs/Django110/lib/python2.7/site-packages/Django/core/management/base.py", line 385, in check
include_deployment_checks=include_deployment_checks,
File "/Users/alasdair/.virtualenvs/Django110/lib/python2.7/site-packages/Django/core/management/base.py", line 372, in _run_checks
return checks.run_checks(**kwargs)
File "/Users/alasdair/.virtualenvs/Django110/lib/python2.7/site-packages/Django/core/checks/registry.py", line 81, in run_checks
new_errors = check(app_configs=app_configs)
File "/Users/alasdair/.virtualenvs/Django110/lib/python2.7/site-packages/Django/core/checks/urls.py", line 14, in check_url_config
return check_resolver(resolver)
File "/Users/alasdair/.virtualenvs/Django110/lib/python2.7/site-packages/Django/core/checks/urls.py", line 24, in check_resolver
for pattern in resolver.url_patterns:
File "/Users/alasdair/.virtualenvs/Django110/lib/python2.7/site-packages/Django/utils/functional.py", line 35, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "/Users/alasdair/.virtualenvs/Django110/lib/python2.7/site-packages/Django/urls/resolvers.py", line 310, in url_patterns
patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
File "/Users/alasdair/.virtualenvs/Django110/lib/python2.7/site-packages/Django/utils/functional.py", line 35, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "/Users/alasdair/.virtualenvs/Django110/lib/python2.7/site-packages/Django/urls/resolvers.py", line 303, in urlconf_module
return import_module(self.urlconf_name)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/Users/alasdair/dev/urlproject/urlproject/urls.py", line 28, in <module>
url(r'^$', 'myapp.views.home'),
File "/Users/alasdair/.virtualenvs/Django110/lib/python2.7/site-packages/Django/conf/urls/__init__.py", line 85, in url
raise TypeError('view must be a callable or a list/Tuple in the case of include().')
TypeError: view must be a callable or a list/Tuple in the case of include().
Django 1.10では、URLパターンでビューを文字列(例:'myapp.views.home'
)として指定することはできなくなりました。
解決策は、呼び出し可能なビューを含めるようにurls.py
を更新することです。これはurls.py
にビューをインポートしなければならないことを意味します。あなたのURLパターンが名前を持っていないのなら、ドットを付けたpythonパスで逆にすることはもはやうまくいかないので、今はそれを追加するのに良い時です。
from Django.conf.urls import include, url
from Django.contrib.auth.views import login
from myapp.views import home, contact
urlpatterns = [
url(r'^$', home, name='home'),
url(r'^contact/$', contact, name='contact'),
url(r'^login/$', login, name='login'),
]
多数のビューがある場合は、それらを個別にインポートするのは不便です。別の方法はあなたのアプリからviewsモジュールをインポートすることです。
from Django.conf.urls import include, url
from Django.contrib.auth import views as auth_views
from myapp import views as myapp_views
urlpatterns = [
url(r'^$', myapp_views.home, name='home'),
url(r'^contact/$', myapp_views.contact, name='contact'),
url(r'^login/$', auth_views.login, name='login'),
]
as myapp_views
とas auth_views
を使用したことに注意してください。これにより、衝突することなく複数のアプリからviews.py
をインポートできます。
urlpatterns
についての詳細は Django URLディスパッチャのドキュメント をご覧ください。
このエラーは、myapp.views.home
が関数のように呼び出すことができるものではないことを意味します。それは実際には文字列です。あなたの解決策はDjango 1.9で動作しますが、それにもかかわらずこれはバージョン1.10以降では廃止予定であるという警告を投げます。 @Alasdairによる以前のソリューションでは、必要なビュー関数をfrom myapp import views as myapp_views
またはfrom myapp.views import home, contact
を介してスクリプトにインポートしていました。
ビューとモジュールの名前が衝突している場合も、このエラーが発生する可能性があります。私は自分のビューファイルをviewsフォルダ/views/view1.py, /views/view2.py
の下に配布し、view2.pyのtable.pyという名前のモデルをインポートしたときにエラーが発生しました。これはview1.pyのビューの名前です。そのため、ビュー関数にv_table(request,id)
という名前を付けることが役に立ちました。
あなたのコードは
urlpatterns = [
url(r'^$', 'myapp.views.home'),
url(r'^contact/$', 'myapp.views.contact'),
url(r'^login/$', 'Django.contrib.auth.views.login'),
]
include()
関数をインポートしているので、これを次のように変更します。
urlpatterns = [
url(r'^$', views.home),
url(r'^contact/$', views.contact),
url(r'^login/$', views.login),
]