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

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



답변

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.


답변

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


답변

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


답변

귀하의 코드는

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


답변