Nach dem Upgrade auf Django 1.10 erhalte ich die Fehlermeldung:
TypeError: view must be a callable or a list/Tuple in the case of include().
Meine urls.py lautet wie folgt:
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'),
]
Das 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 <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().
In Django 1.10 können Sie Ansichten nicht mehr als Zeichenfolge (z. B. 'myapp.views.home'
) in Ihren URL-Mustern angeben.
Die Lösung besteht darin, Ihren urls.py
zu aktualisieren, um die aufrufbare Ansicht einzuschließen. Das bedeutet, dass Sie die Ansicht in Ihren urls.py
importieren müssen. Wenn Ihre URL-Muster keinen Namen haben, ist jetzt ein guter Zeitpunkt, um einen hinzuzufügen, da das Umkehren mit dem gepunkteten Python-Pfad nicht mehr funktioniert.
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'),
]
Wenn viele Ansichten vorhanden sind, kann der Import der einzelnen Ansichten unbequem sein. Alternativ können Sie das Ansichtenmodul aus Ihrer App importieren.
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'),
]
Beachten Sie, dass wir as myapp_views
und as auth_views
verwendet haben, wodurch wir den views.py
aus mehreren Apps importieren können, ohne dass diese miteinander kollidieren.
Weitere Informationen zu urlpatterns
finden Sie in den Django-URL-Dispatcher-Dokumenten .
Dieser Fehler bedeutet nur, dass myapp.views.home
nicht wie eine Funktion aufgerufen werden kann. Es ist tatsächlich eine Zeichenfolge. Während Ihre Lösung in Django 1.9 funktioniert, wird dennoch eine Warnung ausgegeben, die besagt, dass diese Version ab Version 1.10 nicht mehr verwendet wird. Dies ist genau der Fall. Die vorherige Lösung von @Alasdair importiert die erforderlichen Ansichtsfunktionen über entweder .__ in das Skript. from myapp import views as myapp_views
oder from myapp.views import home, contact
Diese Fehlermeldung kann auch angezeigt werden, wenn ein Namenskonflikt zwischen einer Ansicht und einem Modul besteht. Ich habe den Fehler erhalten, wenn ich meine Ansichtsdateien im Ordner ″ Ansichten ″, /views/view1.py, /views/view2.py
, verteile und ein Modell namens table.py in view2.py importierte, das zufällig der Name einer Ansicht in view1.py war. Die Benennung der View-Funktionen als v_table(request,id)
hat geholfen.
Ihr Code lautet
urlpatterns = [
url(r'^$', 'myapp.views.home'),
url(r'^contact/$', 'myapp.views.contact'),
url(r'^login/$', 'Django.contrib.auth.views.login'),
]
Ändern Sie sie beim Importieren der include()
-Funktion in Folgendes:
urlpatterns = [
url(r'^$', views.home),
url(r'^contact/$', views.contact),
url(r'^login/$', views.login),
]