Django URL错误:在include()的情况下,视图必须是可调用的或者列表/元组

升级到Django 1.10后,出现错误:

TypeError: view must be a callable or a list/tuple in the case of include(). 

我的urls.py如下所示:

 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'视图指定为string(例如'myapp.views.home' )。

解决的办法是更新你的urls.py来包含视图可调用。 这意味着你必须在你的urls.py导入视图。 如果您的URL模式没有名称,那么现在是添加一个名称的好时机,因为使用虚线pythonpath反转不再起作用。

 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'), ] 

如果有多个视图,那么单独导入它们可能是不方便的。 另一种方法是从您的应用程序导入视图模块。

 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_viewsas auth_views ,这使我们可以从多个应用程序中导入views.py ,而不会发生冲突。

有关urlpatterns更多信息,请参阅Django URL调度程序文档 。

这个错误只是意味着myapp.views.home不是可以调用的东西,就像一个函数一样。 这实际上是一个string。 虽然你的解决scheme在Django 1.9中工作,但它会抛出一个警告,说这将从版本1.10起,这正是发生了什么。 @Alasdair以前的解决scheme通过from myapp import views as myapp_views必要的视图函数到脚本中from myapp import views as myapp_viewsfrom myapp.views import home, contact