Después de actualizar a Django 1.10, aparece el error:
TypeError: view must be a callable or a list/tuple in the case of include().
Mi urls.py es el siguiente:
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 <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().
python
django
django-urls
django-1.10
Alasdair
fuente
fuente
None
, lo que provocaría unTypeError
como el anterior.Respuestas:
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 invocable. Esto significa que debe importar la vista en suurls.py
. Si sus patrones de URL no tienen nombres, ahora es un buen momento para agregar uno, porque invertir con la ruta de Python punteada ya no funciona.Si hay muchas vistas, importarlas individualmente puede resultar inconveniente. Una alternativa es importar el módulo de vistas desde su aplicación.
Tenga en cuenta que hemos utilizado
as myapp_views
yas auth_views
, lo que nos permite importarviews.py
desde varias aplicaciones sin que entren en conflicto.Consulte los documentos del despachador de URL de Django para obtener más información sobre
urlpatterns
.fuente
import_module
podría ayudarlo a crear su propia búsqueda como contenedor para la cadena antigua, en el caso de que miles de URL estén esperando que las actualice.django.conf.urls.defaults
desde Django 1.5 o anterior). Agregué las importaciones como me pidió, pero no estoy seguro de que sea una buena idea, ya que las importaciones cambian nuevamente en Django 2.0. Si desea conocer las importaciones correctas, los documentos para su versión de Django (por ejemplo , 1.11 , 2.0 ) son el mejor lugar para buscar.Este error solo significa que
myapp.views.home
no es algo que se pueda llamar, como una función. De hecho, es una cuerda. Si bien su solución funciona en django 1.9, sin embargo, arroja una advertencia que dice que esto se desaprobará a partir de la versión 1.10, que es exactamente lo que sucedió. La solución anterior de @Alasdair importa las funciones de visualización necesarias en el script a través defrom myapp import views as myapp_views
ofrom myapp.views import home, contact
fuente
También puede obtener este error si tiene un conflicto de nombres entre una vista y un módulo. Tengo el error cuando distribuyo mis archivos de vista en la carpeta de vistas,
/views/view1.py, /views/view2.py
e importé un modelo llamado table.py en view2.py que resultó ser el nombre de una vista en view1.py. Así que nombrar las funciones de vista comov_table(request,id)
ayudado.fuente
Tu código es
cámbielo a lo siguiente mientras está importando la
include()
función:fuente