URLs de Django TypeError: la vista debe ser invocable o una lista / tupla en el caso de incluir ()

Después de actualizar a Django 1.10, me aparece el error:

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

Mi urls.py es como sigue:

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

El rastreo completo es:

 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  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 ya no le permite especificar vistas como una cadena (por ejemplo, 'myapp.views.home' ) en sus patrones de URL.

La solución es actualizar su urls.py para incluir la vista que se puede llamar. Esto significa que tiene que importar la vista en su urls.py Si sus patrones de URL no tienen nombres, entonces es un buen momento para agregar uno, porque la inversión con la ruta de Python con puntos ya no funciona.

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

Si hay muchas vistas, importarlas individualmente puede ser inconveniente. Una alternativa es importar el módulo de vistas desde su aplicación.

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

Tenga en cuenta que hemos utilizado as myapp_views y as auth_views , lo que nos permite importar el views.py desde múltiples aplicaciones sin que views.py en conflicto.

Consulte la documentación del despachador de URL de Django para obtener más información acerca de urlpatterns .

Este error solo significa que myapp.views.home no es algo que se pueda llamar, como una función. Es una cadena de hecho. Si bien su solución funciona en django 1.9, sin embargo, lanza una advertencia que dice que esto quedará obsoleto desde la versión 1.10 en adelante, que es exactamente lo que ha sucedido. La solución anterior de @Alasdair importa las funciones de vista necesarias en el script a través from myapp import views as myapp_views o from myapp.views import home, contact

También puede obtener este error si tiene un conflicto de nombres entre una vista y un módulo. Recibo el error cuando distribuyo mis archivos de vista en la carpeta de vistas, /views/view1.py, /views/view2.py e /views/view1.py, /views/view2.py algún modelo llamado table.py en view2.py que resultó ser el nombre de una vista en view1.py. Entonces, nombrar las funciones de vista como v_table(request,id) ayudó.

Tu código es

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

cámbielo a la siguiente a medida que esté importando la función include() :

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