Django URL TypeError : view는 callable이거나 include ()의 경우 목록 / 튜플이어야합니다.


111

Django 1.10으로 업그레이드 한 후 오류가 발생합니다.

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

내 urls.py는 다음과 같습니다.

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

전체 역 추적은 다음과 같습니다.

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

보기에서 데코레이터를 사용하고 아무것도 반환하지 않는 경우. 이 경우에도 위의 오류가 발생합니다. 최근에이 오류가 발생했습니다.
anjaneyulubatta505

@AnjaneyuluBatta 예, 데코레이터가 뷰를 반환하지 않으면 암시 적으로를 반환 하므로 위와 같이 Nonea가 발생합니다 TypeError.
Alasdair

답변:


257

Django 1.10에서는 더 이상 'myapp.views.home'URL 패턴에서 뷰를 문자열 (예 :)로 지정할 수 없습니다 .

해결책은 urls.py호출 가능한 뷰를 포함 하도록 업데이트하는 것 입니다. 즉, urls.py. URL 패턴에 이름이없는 경우 점선 파이썬 경로로 되 돌리는 것이 더 이상 작동하지 않기 때문에 지금이 이름을 추가하는 것이 좋습니다.

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

뷰가 많은 경우 개별적으로 가져 오는 것이 불편할 수 있습니다. 대안은 앱에서보기 모듈을 가져 오는 것입니다.

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

우리가 사용하고 있습니다 as myapp_views그리고 as auth_views우리가를 가져올 수있는, views.py그들이 충돌없이 여러 응용 프로그램에서.

에 대한 자세한 내용은 Django URL 디스패처 문서 를 참조하세요 urlpatterns.


클래스 기반 뷰는 어떻습니까?
Rishabh Agrahari

2
클래스 기반 뷰에 점선 문자열 경로를 사용할 수 없었으므로이 질문과 관련이 없습니다.
Alasdair

접두사도 사용할 수 없기 때문에 이와 같은 변경 사항이 도우미 (마이그레이션 스크립트)와 함께 제공되기를 바랍니다. import_module수천 개의 URL이 업데이트를 기다리고있는 경우 구식 문자열에 대한 래퍼로 자체 조회를 구축하는 데 도움이 될 수 있습니다.
Sławomir Lenart

다른 패키지도 가져와야합니다. django.conf.urls에서 가져 오기 URL을 가져옵니다. 솔루션을 수정하십시오.
WebComer

1
@WebComer Django 1.10으로 업그레이드 할 때 동일하게 유지되기 때문에 질문 / 답변에 URL 가져 오기를 포함하지 않았습니다 ( django.conf.urls.defaultsDjango 1.5 또는 이전 버전에서 가져 오지 않은 경우 ). 요청한대로 가져 오기를 추가했지만 Django 2.0에서 가져 오기가 다시 변경 되었기 때문에 이것이 좋은 생각이라고 확신하지 않습니다. 올바른 가져 오기를 알고 싶다면 Django 버전에 대한 문서 (예 : 1.11 , 2.0 )를 찾는 것이 가장 좋습니다.
Alasdair

3

이 오류 myapp.views.home는 함수처럼 호출 할 수있는 것이 아님을 의미합니다 . 사실 문자열입니다. 귀하의 솔루션이 django 1.9에서 작동하는 동안에도 버전 1.10부터 사용이 중단된다는 경고가 표시됩니다. @Alasdair의 이전 솔루션은 from myapp import views as myapp_views 또는 다음 중 하나를 통해 필요한보기 기능을 스크립트로 가져옵니다. from myapp.views import home, contact


1

뷰와 모듈의 이름 충돌이있는 경우에도이 오류가 발생할 수 있습니다. 보기 파일을보기 폴더 아래에 배포하고 /views/view1.py, /views/view2.pyview1.py에서보기 이름 인 view2.py에서 table.py라는 모델을 가져올 때 오류가 발생 했습니다. 따라서 뷰의 이름을 지정하면 v_table(request,id) 도움이됩니다.


0

귀하의 코드는

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

include()함수를 가져올 때 다음과 같이 변경하십시오 .

urlpatterns = [
    url(r'^$', views.home),
    url(r'^contact/$', views.contact),
    url(r'^login/$', views.login),
]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.