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

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

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

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

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

有关 urlpatterns 的更多信息,请参阅 Django URL dispatcher docs

这个错误只是说明myapp.views.home不是可以调用的东西,像一个函数。它实际上是一个字符串。虽然您的解决方案适用于 django 1.9,但它会发出警告,说明这将从 1.10 版开始弃用,这正是发生的情况。 @Alasdair 之前的解决方案通过以下任一方式将必要的视图函数导入脚本 from myapp import views as myapp_viewsfrom myapp.views import home, contact

如果视图和模块的名称冲突,您也可能会遇到此错误。当我在 views 文件夹 /views/view1.py, /views/view2.py 下分发我的视图文件并在 view2.py 中导入一些名为 table.py 的模型时出现错误,该模型恰好是 [=16] 中的视图名称=].因此将视图函数命名为 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),
]

改变 register = template.Library()registerr = template.Library() 解决了我的问题

以防万一您在终端上遇到错误,如果您停止服务器然后再次 运行 它可能会起作用。 在 Windows 上:

ctrl+c

停止服务器 然后 运行 服务器再次:

python manage.py runserver

干杯。