django MultiValueDictKeyError त्रुटि, मैं इससे कैसे निपटूं


174

मैं अपने डेटाबेस में किसी ऑब्जेक्ट को सहेजने की कोशिश कर रहा हूं, लेकिन यह एक MultiValueDictKeyErrorत्रुटि है।

समस्याओं के रूप में निहित है, is_privateएक चेकबॉक्स द्वारा दर्शाया गया है। यदि चेक बॉक्स चयनित नहीं है, तो जाहिर है कुछ भी पारित नहीं हुआ है। यहीं पर त्रुटि पक जाती है।

मैं इस अपवाद से कैसे ठीक से निपटूं, और इसे पकड़ूं?

लाइन है

is_private = request.POST['is_private']

1
एक अच्छा विचार हमें पूरी त्रुटि और ट्रेस दिखाने का होगा। साथ ही हमें कोड के उस हिस्से के बारे में भी दिखाते हैं, जहाँ त्रुटि हुई है।
rzetterberg

1
क्या कोई समझा सकता है कि यह त्रुटि क्यों होती है? मैंने यह त्रुटि देखी है जब मैं django बाकी में अलग-अलग मॉडल साक्षात्कार का उपयोग करता हूं .....
अमृत

1
इसका सीधा सा मतलब है: कुंजी 'is_private' मौजूद नहीं है!
thePhi

जवाबों:


281

MultiValueDict की getविधि का उपयोग करें । यह मानक dicts पर भी मौजूद है और यह मौजूद नहीं होने पर डिफ़ॉल्ट प्रदान करते हुए एक मूल्य प्राप्त करने का एक तरीका है।

is_private = request.POST.get('is_private', False)

आम तौर पर,

my_var = dict.get(<key>, <default>)

2
यह मुझे कोई मूल्य नहीं देता है, लेकिन मैं POST पर मूल्य भेज रहा हूं: /
यीशु अल्मारल - हैकप्रेंडे

यह सही व्यवहार है .. चेकबॉक्स भेज checkedदिया जाता है जब जाँच की जाती है लेकिन nullअगर जाँच नहीं हुई तो भेज देंगे । आप इसे Chrome / Firefox DEV टूल के "नेटवर्क" पैनल में देख सकते हैं। यही कारण है कि आप Falseडिफ़ॉल्ट मान के रूप में सेट करते हैं: यदि मिला null, तो इसे बनाएं false
पश्चिमीगुन

78

चुनें कि आपके लिए सबसे अच्छा क्या है:

1

is_private = request.POST.get('is_private', False);

यदि is_privateकुंजी अनुरोध में मौजूद है ।POST is_privateचर इसके बराबर होगा, यदि नहीं, तो यह गलत के बराबर होगा।

2

if 'is_private' in request.POST:
    is_private = request.POST['is_private']
else:
    is_private = False

3

from django.utils.datastructures import MultiValueDictKeyError
try:
    is_private = request.POST['is_private']
except MultiValueDictKeyError:
    is_private = False

12
वास्तव में नंबर 3 की सिफारिश नहीं की जा सकती
जो

6
यह अपवाद प्रणाली के दुरुपयोग की तरह लगता है। अपवाद असाधारण व्यवहार को संभालने के लिए होना चाहिए (अर्थात ऐसा व्यवहार जो आप जानते हैं कि हो सकता है, और इससे निपटना चाहिए, लेकिन यह कि आप सामान्य व्यवहार प्रवाह की अपेक्षा नहीं करते हैं)। इस मामले में, अपवाद को फेंक दिया जाएगा और संभावित कार्यक्रम प्रवाह के 50% में पकड़ा जाएगा। इसमें जो धीमा है, वह है। मुझे पता नहीं है कि यह पायथन में कैसे काम करता है, लेकिन मुझे लगता है कि एक महंगा स्टैक-ट्रेस शामिल होगा।
जो

13
django.utils.datastructures से MultiValueDictKeyError
Akseli Palén

8
@ जो - पायथन में यह दृष्टिकोण बहुत आम है। यदि आप अपवाद को पकड़ रहे हैं तो यह स्वचालित रूप से स्टैकट्रेस उत्पन्न नहीं करेगा। docs.python.org/2/glossary.html#term-eafp
bjudson

9
चरण 3 के साथ कुछ भी गलत नहीं है। हम कहते हैं कि अनुमति (ईएएफपी) की तुलना में माफी के लिए पूछना आसान है, और यह पायथन में एक अत्यधिक अनुशंसित कोडिंग शैली है। StackOverflow पर बहुत सारी पोस्ट ने इस पर भी चर्चा की है।
बोबार्ट

12

आपको लगता है कि क्योंकि आप एक शब्दकोश से एक कुंजी प्राप्त करने की कोशिश कर रहे हैं जब यह नहीं है। यदि यह पहले है तो आपको परीक्षण करने की आवश्यकता है।

प्रयत्न:

is_private = 'is_private' in request.POST

या

is_private = 'is_private' in request.POST and request.POST['is_private']

आपके द्वारा उपयोग किए जा रहे मूल्यों के आधार पर।


5

आपने is_privateअपने मॉडलों में इसे परिभाषित करने का प्रयास क्यों नहीं किया default=False?

class Foo(models.Models):
    is_private = models.BooleanField(default=False)

2
वह उस मूल्य को रोक नहीं पाएगा जो वह मूल्य के लिए हाथ से POST की जाँच कर रहा है।
अपोलो डाटा

4

याद रखने वाली एक और बात यह है कि request.POST['keyword']निर्दिष्ट HTML nameविशेषता द्वारा पहचाने गए तत्व को संदर्भित करता है keyword

तो, अगर आपका फॉर्म है:

<form action="/login/" method="POST">
  <input type="text" name="keyword" placeholder="Search query">
  <input type="number" name="results" placeholder="Number of results">
</form>

फिर, request.POST['keyword']और क्रमशः request.POST['results']इनपुट तत्वों का मान होगा keywordऔर results


1

यदि अनुरोध ऑब्जेक्ट में 'is_pStreet' कुंजी पैरामीटर है, तो पहले जांचें। इस मामले के अधिकांश मल्टीवैल्यूडक्टKeyError डिक्शनरी जैसी अनुरोध वस्तु में गायब कुंजी के लिए हुआ। क्योंकि शब्दकोश एक अनियंत्रित कुंजी है, मूल्य जोड़ी "साहचर्य यादें" या "साहचर्य सरणियाँ"

दूसरे शब्दों में। request.GET या request.POST एक शब्दकोश जैसी वस्तु है जिसमें सभी अनुरोध पैरामीटर होते हैं। यह Django के लिए विशिष्ट है।

यदि शब्दकोश में कुंजी दी गई है, तो विधि () दी गई कुंजी के लिए एक मान लौटाती है। यदि कुंजी उपलब्ध नहीं है, तो कोई भी डिफ़ॉल्ट मान नहीं देता है।

आप इस त्रुटि को डाल सकते हैं:

is_private = request.POST.get('is_private', False);

1

मेरे लिए, निम्नलिखित के कारण मेरे django प्रोजेक्ट में यह त्रुटि आई:

  1. मैंने अपने प्रोजेक्ट के टेम्प्लेट फ़ोल्डर में मौजूद अपने होम पेज में एक नया हाइपरलिंक डाला है:

    <input type="button" value="About" onclick="location.href='{% url 'about' %}'">

  2. View.py में, मेरे पास गिनती और के बारे में निम्नलिखित परिभाषाएँ थीं:

   def count(request):
           fulltext = request.GET['fulltext']
           wordlist = fulltext.split()
           worddict = {}
           for word in wordlist:
               if word in worddict:
                   worddict[word] += 1
               else:
                   worddict[word] = 1
                   worddict = sorted(worddict.items(), key = operator.itemgetter(1),reverse=True)
           return render(request,'count.html', 'fulltext':fulltext,'count':len(wordlist),'worddict'::worddict})

   def about(request): 
       return render(request,"about.html")
  1. Urls.py में, मेरे पास निम्न यूआरएल पैटर्न थे:
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('',views.homepage,name="home"),
        path('eggs',views.eggs),
        path('count/',views.count,name="count"),
        path('about/',views.count,name="about"),
    ]

जैसा कि नहीं में देखा जा सकता है। ऊपर 3, पिछले यूआरएल पैटर्न में, मैं गलत तरीके से views.count कॉल कर रहा था, जबकि मुझे views.about को कॉल करने की आवश्यकता थी। fulltext = request.GET['fulltext']काउंट फ़ंक्शन में यह लाइन (जिसे गलती से urlpatterns में गलत प्रविष्टि के कारण कहा जाता था) ने व्यू मल्टीवैलिडिक्टेकर अपवाद को फेंक दिया।

फिर मैंने urls.py में अंतिम url पैटर्न को सही में बदल दिया path('about/',views.about,name="about"), और सबकुछ ठीक हो गया।

जाहिरा तौर पर, django में सामान्य रूप से एक नौसिखिया प्रोग्रामर गलती कर सकता है कि मैंने गलत तरीके से एक url के लिए दूसरे दृश्य फ़ंक्शन को कॉल किया है, जो अपेक्षित व्यवहार के बजाय मापदंडों के अलग-अलग सेट या इसके रेंडर कॉल में ऑब्जेक्ट के अलग-अलग सेट पास करने की उम्मीद कर सकता है।

उम्मीद है कि यह कुछ नौसिखिया प्रोग्रामर को django के लिए मदद करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.