it-swarm.com.de

Django-URLs TypeError: view muss im Fall von include () eine aufrufbare Liste oder ein Tuple/Tuple sein.

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().
87
Alasdair

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 .

221
Alasdair

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

3
hAcKnRoCk

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.

0
binboavetonik

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),
]
0
Nishant Soni