জ্যাঙ্গো মাল্টিভ্যালুডিক্টকি কী ত্রুটি, আমি কীভাবে এটি মোকাবেলা করব


174

আমি আমার ডাটাবেসে একটি জিনিস সংরক্ষণ করার চেষ্টা করছি, তবে এটি একটি MultiValueDictKeyErrorত্রুটি ছুঁড়েছে ।

সমস্যাগুলি ফর্মের মধ্যে রয়েছে, এটি is_privateএকটি চেকবক্স দ্বারা প্রতিনিধিত্ব করা হয়। যদি চেক বাক্সটি নির্বাচিত না হয়, স্পষ্টতই কিছুই পাস করা হয় না। এই যেখানে ত্রুটি chucked হয়।

আমি কীভাবে সঠিকভাবে এই ব্যতিক্রমটি মোকাবেলা করব এবং এটি ধরব?

লাইন হয়

is_private = request.POST['is_private']

1
একটি ভাল ধারণাটি আমাদের পুরো ত্রুটি এবং ট্রেসটি দেখানো হবে। ত্রুটি উত্থাপিত হয়েছে এমন কোডের সেই অংশটি আমাদের আরও দেখান।
rzetterberg

1
এই ত্রুটি দেখা দেয় কেন কেউ ব্যাখ্যা করতে পারে? আমি যখন জাঙ্গো বিশ্রামে বিভিন্ন মডেলভিউসেট ব্যবহার করি তখন আমি এই ত্রুটিটি দেখেছি .....
অমৃত

1
এর অর্থ হ'ল: 'is_private' কীটি বিদ্যমান নেই!
TheFhi

উত্তর:


281

মাল্টিভ্যালিউডিক্টের getপদ্ধতিটি ব্যবহার করুন । এটি স্ট্যান্ডার্ড ডিক্টসেও উপস্থিত এবং এটি বিদ্যমান না থাকলে ডিফল্ট সরবরাহ করার সময় মান আনার উপায়।

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

সাধারণত,

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

2
এটি আমাকে কোনও মূল্য দেয় না তবে আমি
পোস্টটিতে

এটি সঠিক আচরণ .. চেকবক্সটি checkedচেক করা হলে প্রেরণ করা হবে nullতবে যাচাই করা না থাকলে পাঠানো হবে । আপনি এটি Chrome / ফায়ারফক্স ডিএইভি সরঞ্জামটির "নেটওয়ার্ক" প্যানেলে পরীক্ষা করতে পারেন। এজন্য আপনি Falseডিফল্ট মান হিসাবে সেট করেছেন: যদি পাওয়া যায় তবে nullএটি তৈরি করুন false
ওয়েস্টার্নগান

78

আপনার জন্য সবচেয়ে ভাল কি চয়ন করুন:

1

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

যদি is_privateঅনুরোধে কী উপস্থিত থাকে। 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% প্রবাহকে ধরা হবে caught এর সাথে যুক্ত হয়েছে ধীর-ডাউন। পাইথনে এটি কীভাবে কাজ করে তার বিশদ আমি জানি না, তবে আমি ভাবতে পারি যে একটি ব্যয়বহুল স্ট্যাক-ট্রেস এতে যুক্ত হবে।
জো

13
django.utils.datastructures আমদানি মাল্টিভ্যালিউডিক্ট কি
এরর

8
@ জো - পাইথনে এই পদ্ধতিটি বেশ সাধারণ। আপনি যদি ব্যতিক্রমটি ধরেন তবে এটি স্বয়ংক্রিয়ভাবে স্ট্যাকট্রেস তৈরি করবে না। docs.python.org/2/glossary.html#term-eafp
bjudson

9
৩ য় পদক্ষেপে কোনও সমস্যা নেই We স্ট্যাকওভারফ্লোতে প্রচুর পোস্ট এমনকি এটি নিয়ে আলোচনা করেছে।
বোবার্ট

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
এটি সেই ত্রুটিটি আটকাতে পারে না যে মূল্যটির জন্য তিনি নিজের হাতে পোষ্টটি পরীক্ষা করছেন।
অ্যাপোলো ডেটা

4

আরেকটি বিষয় মনে রাখতে হবে তা request.POST['keyword']হল নির্দিষ্ট এইচটিএমএল 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_private' কী প্যারামিটার রয়েছে কিনা তা প্রথমে পরীক্ষা করুন। মামলার বেশিরভাগ ক্ষেত্রে এই মাল্টিভ্যালুডিক্টকি-এরর শব্দটি অভিধানের মতো অনুরোধ অবজেক্টে কী হারিয়ে যাওয়ার কারণে ঘটেছিল। যেহেতু অভিধানটি একটি অ-রক্ষিত কী, মান জোড় "সহযোগী স্মৃতি" বা "সহযোগী অ্যারে"

অন্য কথায়। অনুরোধ.গেট বা অনুরোধ.পস্ট হ'ল একটি অভিধানের মতো বস্তু যা সমস্ত অনুরোধের পরামিতি ধারণ করে। এটি জ্যাঙ্গোর জন্য নির্দিষ্ট।

পদ্ধতিটি () কীটি অভিধানে থাকলে প্রদত্ত কীটির জন্য একটি মান প্রদান করে। যদি কীটি উপলভ্য না থাকে তবে ডিফল্ট মানটি দেয় না।

আপনি এই ত্রুটিটি হ্যান্ডেল করতে পারেন:

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

1

আমার জন্য, আমার জ্যাঙ্গো প্রকল্পে এই ত্রুটিটি নিম্নলিখিত কারণে ঘটেছে:

  1. আমি নীচে হিসাবে আমার প্রকল্পের টেমপ্লেট ফোল্ডারে আমার হোম এইচটিএমএল উপস্থিত একটি নতুন হাইপারলিংক প্রবেশ করিয়েছি:

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

  2. ভিউ.পি-তে আমার গণনা এবং সম্পর্কে নিম্নলিখিত সংজ্ঞা ছিল:

   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 এ, আমার কাছে নিম্নলিখিত url প্যাটার্নগুলি ছিল:
    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 এর উপরে, শেষ url প্যাটার্নে, আমি ভুলভাবে ভিউসকোয়েন্টকে কল করছিলাম যেখানে আমার ভিউস.বাউট সম্পর্কে কল করতে হবে। fulltext = request.GET['fulltext']গণনা ফাংশনে এই লাইনটি (যা ভুলভাবে urlpatterns এ ভুল প্রবেশের কারণে ডাকা হয়েছিল) ভিউ.পি এর মাল্টিভালিউডিকুইডকিয়ারের ব্যতিক্রম ছুঁড়েছিল।

তারপরে আমি url.py এ শেষ ইউআরএল প্যাটার্নটি সঠিক একটিতে পরিবর্তন করেছি path('about/',views.about,name="about") এবং সবকিছু ঠিকঠাক কাজ করেছে।

স্পষ্টতই, জ্যাঙ্গোতে একজন নবাগত প্রোগ্রামার ভুলভাবে অন্য কোনও ভিউ ফাংশনটি ইউআরএলের জন্য কল করার জন্য ভুল করে ফেলতে পারে, যা উদ্দেশ্যমূলক আচরণের পরিবর্তে বিভিন্ন সেট পরামিতিগুলির প্রত্যাশা বা তার রেন্ডার কলগুলিতে বিভিন্ন সেট অবজেক্ট করে।

আশা করি এটি কিছু নবাগত প্রোগ্রামারকে জ্যাঙ্গো করতে সহায়তা করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.