Django URL'leri TypeError: include () durumunda görünüm çağrılabilir veya liste / tuple olmalıdır


111

Django 1.10'a yükselttikten sonra şu hatayı alıyorum:

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

Urls.py'im şu şekildedir:

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

Tam izleme şudur:

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

Görünümde dekoratörler kullanırsak ve hiçbir şey geri dönmezse. Bu durumda da yukarıdaki hatayı alıyoruz. son zamanlarda bu hatayı aldım.
anjaneyulubatta505

@AnjaneyuluBatta evet, bir dekoratör bir görünüm döndürmezse None, örtük olarak geri döner , bu TypeErrorda yukarıdaki gibi a neden olur .
Alasdair

Yanıtlar:


257

Django 1.10 artık görünümleri 'myapp.views.home'URL kalıplarınızda bir dizge (örneğin ) olarak belirtmenize izin vermiyor .

Çözüm, sizi urls.pyçağrılabilir görünümü içerecek şekilde güncellemektir . Bu, görünümü dosyanıza aktarmanız gerektiği anlamına gelir urls.py. URL modellerinizin adları yoksa, şimdi bir tane eklemek için iyi bir zaman, çünkü noktalı python yolu ile tersine çevirmek artık çalışmıyor.

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

Çok sayıda görünüm varsa, bunları tek tek içe aktarmak sakıncalı olabilir. Bir alternatif, görünümler modülünü uygulamanızdan içe aktarmaktır.

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

Kullandığımızı as myapp_viewsve as auth_viewsbu views.py, birden çok uygulamadan çakışmadan içe aktarmamıza izin verdiğini unutmayın.

Bkz Django URL'yi hareket memuru docs hakkında daha fazla bilgi için urlpatterns.


Sınıf temelli görüşler ne olacak?
Rishabh Agrahari

2
Sınıf temelli görünümler için noktalı dizgi yolunu hiçbir zaman kullanamadınız, bu nedenle bunlar bu soruyla ilgili değil.
Alasdair

Bunun gibi değişikliğin bir yardımcı (geçiş betiği) ile geldiğini görmek isterim, çünkü önek de kullanamazsınız. import_moduleBinlerce url'nin onları güncellemenizi beklediği bir durumda, eski yöntem dizesi için bir sarmalayıcı olarak kendi arama oluşturmanıza yardımcı olabilir.
Sławomir Lenart

Yine de diğer paketleri içe aktarmanız gerekir - django.conf.urls ithalat url'sinden içe aktarın. Lütfen çözümünüzü düzeltin.
WebComer

1
@WebComer Url içe aktarmayı soruya / cevaba dahil etmedim çünkü Django 1.10'a yükseltirken aynı kalıyorlar ( django.conf.urls.defaultsDjango 1.5 veya önceki sürümlerden olmadıkça ). İstediğiniz gibi içe aktarımları ekledim, ancak Django 2.0'da ithalatlar yeniden değiştiği için bunun iyi bir fikir olduğundan emin değilim. Doğru içe aktarımları bilmek istiyorsanız, Django sürümünüzün belgeleri (örn. 1.11 , 2.0 ) bakılacak en iyi yerdir.
Alasdair

3

Bu hata myapp.views.home, bunun bir işlev gibi çağrılabilecek bir şey olmadığı anlamına gelir . Aslında bir dizedir. Çözümünüz django 1.9'da çalışırken, yine de bunun 1.10 sürümünden itibaren kullanımdan kaldırılacağını söyleyen bir uyarı atıyor, tam olarak olan buydu. @Alasdair'in önceki çözümü, gerekli görünüm işlevlerini from myapp import views as myapp_views veya from myapp.views import home, contact


1

Bu hatayı, bir görünüm ve bir modülün isim çatışması varsa da alabilirsiniz. Görünüm dosyalarımı görünümler klasörü altında /views/view1.py, /views/view2.pydağıttığımda ve view1.py'de bir görünüm adı olan table.py adlı bir modeli view2.py'de içe aktardığımda hata aldım. Dolayısıyla, görünümü adlandırmak v_table(request,id) yardımcı olduğu gibi işlev görür .


0

Kodunuz

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

include()işlevi içe aktarırken aşağıdaki şekilde değiştirin :

urlpatterns = [
    url(r'^$', views.home),
    url(r'^contact/$', views.contact),
    url(r'^login/$', views.login),
]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.