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

时间:2022-04-28 16:56:21

After upgrading to Django 1.10, I get the error:

升级到Django 1.10之后,我得到了错误:

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

My urls.py is as follows:

我的url。py如下:

urlpatterns = [
    url(r'^$', 'myapp.views.home'),
    url(r'^contact/$', 'myapp.views.contact'),
    url(r'^login/$', 'django.contrib.auth.views.login'),
]

The full traceback is:

完整的回溯是:

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().

3 个解决方案

#1


195  

Django 1.10 no longer allows you to specify views as a string (e.g. 'myapp.views.home') in your URL patterns.

Django 1.10不再允许将视图指定为字符串。“myapp.view .home”)在你的URL模式中。

The solution is to update your urls.py to include the view callable. This means that you have to import the view in your urls.py. If your URL patterns don't have names, then now is a good time to add one, because reversing with the dotted python path no longer works.

解决方案是更新您的url。py以包含可调用的视图。这意味着必须在url .py中导入视图。如果您的URL模式没有名称,那么现在是添加一个名称的好时机,因为反向使用虚线的python路径将不再有效。

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

If there are many views, then importing them individually can be inconvenient. An alternative is to import the views module from your app.

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

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

Note that we have used as myapp_views and as auth_views, which allows us to import the views.py from multiple apps without them *ing.

请注意,我们使用了myapp_views和auth_views,这允许我们导入视图。来自多个应用程序的py,不会发生冲突。

See the Django URL dispatcher docs for more information about urlpatterns.

有关urlpatterns的更多信息,请参见Django URL分发器文档。

#2


3  

This error just means that myapp.views.home is not something that can be called, like a function. It is a string in fact. While your solution works in django 1.9, nevertheless it throws a warning saying this will deprecate from version 1.10 onwards, which is exactly what has happened. The previous solution by @Alasdair imports the necessary view functions into the script through either from myapp import views as myapp_views or from myapp.views import home, contact

这个错误只表示myapp.views。家不是可以被称为函数的东西。它实际上是一根弦。虽然您的解决方案在django 1.9中可以工作,但是它会抛出一个警告,说明从1.10版本开始将不再使用这个解决方案,这正是已经发生的事情。@Alasdair之前的解决方案通过myapp导入视图作为myapp_views或myapp导入脚本所需的视图函数。视图导入,接触

#3


0  

You may also get this error if you have a name * of a view and a module. I've got the error when i distribute my view files under views folder, /views/view1.py, /views/view2.py and imported some model named table.py in view2.py which happened to be a name of a view in view1.py. So naming the view functions as v_table(request,id) helped.

如果视图和模块名称冲突,也可能会出现此错误。当我在视图文件夹下分配视图文件时,我得到了错误。py /视图/ view2。并导入了一些名为table的模型。py view2。py碰巧是view1.py中视图的名称。因此,将视图函数命名为v_table(请求、id)是有帮助的。

#1


195  

Django 1.10 no longer allows you to specify views as a string (e.g. 'myapp.views.home') in your URL patterns.

Django 1.10不再允许将视图指定为字符串。“myapp.view .home”)在你的URL模式中。

The solution is to update your urls.py to include the view callable. This means that you have to import the view in your urls.py. If your URL patterns don't have names, then now is a good time to add one, because reversing with the dotted python path no longer works.

解决方案是更新您的url。py以包含可调用的视图。这意味着必须在url .py中导入视图。如果您的URL模式没有名称,那么现在是添加一个名称的好时机,因为反向使用虚线的python路径将不再有效。

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

If there are many views, then importing them individually can be inconvenient. An alternative is to import the views module from your app.

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

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

Note that we have used as myapp_views and as auth_views, which allows us to import the views.py from multiple apps without them *ing.

请注意,我们使用了myapp_views和auth_views,这允许我们导入视图。来自多个应用程序的py,不会发生冲突。

See the Django URL dispatcher docs for more information about urlpatterns.

有关urlpatterns的更多信息,请参见Django URL分发器文档。

#2


3  

This error just means that myapp.views.home is not something that can be called, like a function. It is a string in fact. While your solution works in django 1.9, nevertheless it throws a warning saying this will deprecate from version 1.10 onwards, which is exactly what has happened. The previous solution by @Alasdair imports the necessary view functions into the script through either from myapp import views as myapp_views or from myapp.views import home, contact

这个错误只表示myapp.views。家不是可以被称为函数的东西。它实际上是一根弦。虽然您的解决方案在django 1.9中可以工作,但是它会抛出一个警告,说明从1.10版本开始将不再使用这个解决方案,这正是已经发生的事情。@Alasdair之前的解决方案通过myapp导入视图作为myapp_views或myapp导入脚本所需的视图函数。视图导入,接触

#3


0  

You may also get this error if you have a name * of a view and a module. I've got the error when i distribute my view files under views folder, /views/view1.py, /views/view2.py and imported some model named table.py in view2.py which happened to be a name of a view in view1.py. So naming the view functions as v_table(request,id) helped.

如果视图和模块名称冲突,也可能会出现此错误。当我在视图文件夹下分配视图文件时,我得到了错误。py /视图/ view2。并导入了一些名为table的模型。py view2。py碰巧是view1.py中视图的名称。因此,将视图函数命名为v_table(请求、id)是有帮助的。