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)是有帮助的。