Django URL TypeError: शामिल करने के मामले में देखने के लिए एक कॉल करने योग्य या सूची / टपल होना चाहिए ()


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

अगर हम सज्जाकारों को देखने के लिए उपयोग करते हैं और यदि यह कुछ भी नहीं लौटाता है। इस मामले में भी हमें उपरोक्त त्रुटि मिलती है। हाल ही में मुझे यह त्रुटि मिली।
अंजन्युलुबट्टा ५०

@AnjaneyuluBatta हाँ, यदि कोई डेकोरेटर एक दृश्य नहीं लौटाता है None, तो इसका तात्पर्य है कि यह एक TypeErrorउपरोक्त कारण होगा ।
अलसादेयर

जवाबों:


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


वर्ग आधारित विचारों के बारे में क्या?
ऋषभ अग्रहरी

2
आप वर्ग आधारित दृश्यों के लिए डॉटेड स्ट्रिंग पथ का उपयोग करने में कभी सक्षम नहीं हुए हैं, इसलिए वे इस प्रश्न के लिए प्रासंगिक नहीं हैं।
अलास्दैर

मैं इस तरह के बदलाव को कुछ सहायक (एक माइग्रेटिंग स्क्रिप्ट) के साथ देखना चाहता हूं, क्योंकि आप उपसर्ग का उपयोग करने में सक्षम नहीं हैं। import_moduleपुराने तरीके की स्ट्रिंग के लिए रैपर के रूप में स्वयं के लुकअप को बनाने में आपकी मदद कर सकता है, एक मामले में जब हजारों यूआरएल आपको अपडेट करने के लिए इंतजार कर रहे हैं।
स्लावोमिर लेनार्ट

आपको अभी भी अन्य पैकेज आयात करने हैं, - django.conf.urls से आयात url आयात करें। कृपया अपना समाधान ठीक करें।
वेबकॉमर

1
@WebComer मैंने सवाल / जवाब में url आयात को शामिल नहीं किया क्योंकि वे Django 1.10 में अपग्रेड करते समय एक ही रहते हैं (जब तक कि आपके पास django.conf.urls.defaultsDjango 1.5 या उससे पहले का नहीं है)। जैसा कि आपने पूछा, मैंने आयात जोड़ दिया है, लेकिन मुझे यकीन नहीं है कि यह एक अच्छा विचार है, क्योंकि आयात फिर से Django 2.0 में बदल जाता है। यदि आप सही आयात जानना चाहते हैं, तो आपके Django संस्करण (जैसे 1.11 , 2.0 ) के लिए डॉक्स सबसे अच्छी जगह हैं।
अलास्देयर

3

इस त्रुटि का मतलब है कि myapp.views.homeऐसा कुछ नहीं है जिसे एक फ़ंक्शन की तरह कहा जा सकता है। यह वास्तव में एक स्ट्रिंग है। हालांकि आपका समाधान 1.9 django में काम करता है, फिर भी यह कहते हुए चेतावनी फेंकता है कि यह संस्करण 1.10 से आगे निकलेगा, जो वास्तव में हुआ है। @Alasdair द्वारा पिछला समाधान स्क्रिप्ट में आवश्यक दृश्य फ़ंक्शंस को from myapp import views as myapp_views या तो आयात करता है from myapp.views import home, contact


1

यदि आपके पास दृश्य और मॉड्यूल का नाम क्लैश है, तो आपको यह त्रुटि भी हो सकती है। जब मैंने अपने दृश्य फ़ाइलों को व्यू फ़ोल्डर में वितरित किया है, तो मुझे त्रुटि मिली है /views/view1.py, /views/view2.pyऔर कुछ मॉडल को view2.py में आयात किया है , जो view1.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),
]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.