Django URLs TypeError: view muss eine aufrufbar sein oder eine list / tuple im Falle von include ()

Nach dem Upgrade auf Django 1.10 bekomme ich den Fehler:

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

Mein urls.py ist wie folgt:

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

Der vollständige Traceback ist:

 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 erlaubt es Ihnen nicht mehr, Sichten als String (zB 'myapp.views.home' ) in Ihren URL-Mustern anzugeben.

Die Lösung besteht darin, Ihre urls.py zu aktualisieren, dass sie die aufrufbare Ansicht enthält. Dies bedeutet, dass Sie die Ansicht in Ihre urls.py importieren urls.py . Wenn Ihre URL-Muster keine Namen haben, ist es jetzt an der Zeit, eine hinzuzufügen, da die Umkehrung mit dem gepunktetem Python-Pfad nicht mehr funktioniert.

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

Wenn es viele Ansichten gibt, kann es unpraktisch sein, sie einzeln zu importieren. Eine Alternative besteht darin, das Sichtenmodul aus Ihrer App zu importieren.

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

Beachten Sie, dass wir ” as myapp_views und ” as auth_views verwendet haben. as myapp_views können wir die views.py aus mehreren Apps importieren, ohne dass sie kollidieren.

Weitere Informationen zu URL- urlpatterns Sie in den Django-URL-Dispatcher-Dokumenten .

Dieser Fehler bedeutet nur, dass myapp.views.home nicht wie eine function aufgerufen werden kann. Es ist eine Schnur in der Tat. Während Ihre Lösung in django 1.9 funktioniert, gibt es dennoch eine Warnung, die besagt, dass diese Version ab Version 1.10 ablehnen wird, was genau passiert ist. Die vorherige Lösung von @Alasdair importiert die erforderlichen View-functionen in das Skript entweder from myapp import views as myapp_views oder from myapp.views import home, contact

Sie können diesen Fehler auch erhalten, wenn Sie einen Namenskonflikt zwischen einer Ansicht und einem Modul haben. Ich habe den Fehler, wenn ich meine Ansichtsdateien im views-Ordner, /views/view1.py, /views/view2.py und importierte ein Modell namens table.py in view2.py, das zufällig ein Name einer Ansicht war in view1.py. Daher half die Benennung der View-functionen als v_table(request,id) .

Dein Code ist

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

ändere es in folgendes, während du die include() function importierst:

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