2016-08-03 2 views
66

, 내가 오류의 경우/튜플 호출 가능한 또는 목록을해야합니다 :장고 URL에 오류 : 다음과 같이</p> <pre><code>TypeError: view must be a callable or a list/tuple in the case of include(). </code></pre> <p>내 urls.py는 다음과 같습니다 뷰) (포함 1.10 장고로 업그레이드 한 후

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

을 통해 스크립트에 필요한 뷰 기능을 가져옵니다. 이 경우에도 위의 오류가 발생합니다. 최근에이 오류가 발생했습니다. –

+0

@AnjaneyuluBatta 그렇습니다. 데코레이터가 뷰를 반환하지 않으면 암시 적으로'None'을 반환합니다. 그러면 위와 같이'TypeError'가 발생합니다. – Alasdair

답변

174

장고 1.10가 더 이상 문자열로 의견을 (지정할 수 있습니다 예를 들어,268,)을 귀하의 URL 패턴에 추가하십시오.

해결책은 호출 가능보기를 포함하도록 urls.py을 업데이트하는 것입니다. 즉, urls.py에서보기를 가져와야합니다. URL 패턴에 이름이 없으면 점으로 구분 된 파이썬 경로로 되돌리기가 더 이상 작동하지 않으므로 이제는 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'), 
] 

많은보기가있는 경우 개별적으로 가져 오는 것이 불편할 수 있습니다. 또 다른 방법은 앱에서보기 모듈을 가져 오는 것입니다. 우리가 그들을 충돌없이 여러 응용 프로그램에서 views.py를 가져올 수 있습니다 우리는 as myapp_viewsas auth_views을 사용했다

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

참고.

urlpatterns에 대한 자세한 내용은 Django URL dispatcher docs을 참조하십시오.

+0

클래스 기반보기는 어떻습니까? –

+1

클래스 기반보기에 점으로 구분 된 문자열 경로를 사용할 수 없었기 때문에이 질문과 관련이 없습니다. – Alasdair

+0

접두사를 사용할 수 없기 때문에 이와 같은 변경 사항을 일부 도우미 (마이그레이션 스크립트)와 함께보고 싶습니다. 'import_module'은 수천 개의 URL이 업데이트를 기다리고있는 경우에 구형 문자열에 대한 래퍼 (wrapper)로서 자신 만의 lookup을 구축하는 것을 도울 수 있습니다. –

3

이 오류는 myapp.views.home이 함수처럼 호출 할 수없는 것을 의미합니다. 그것은 실제로 문자열입니다. 귀하의 솔루션은 장고 1.9에서 작동하지만 그럼에도 불구하고 이것은 정확히 무슨 일이 일어 났는지에 대한 버전 1.10 이후의 사용이 중단 될 것이라는 경고를 던집니다. 우리가보기에 장식을 사용하고 할 경우 아무것도 반환하지 않으면 @Alasdair에 의해 이전의 솔루션 중 하나 from myapp import views as myapp_views 또는 from myapp.views import home, contact