django MultiValueDictKeyError hatası, bununla nasıl başa çıkarım


174

Veritabanım için bir nesne kaydetmeye çalışıyorum, ama bir MultiValueDictKeyErrorhata atıyor .

Sorunlar form içinde yatıyor, is_privatebir onay kutusuyla gösterilir. Onay kutusu seçili DEĞİLSE, açıkça hiçbir şey iletilmez. Bu, hatanın sıkıştığı yerdir.

Bu istisna ile nasıl düzgün bir şekilde ilgilenirim ve yakalarım?

Çizgi

is_private = request.POST['is_private']

1
İyi bir fikir bize tüm hatayı ve izi göstermek olacaktır. Ayrıca, hatanın ortaya çıktığı kod kısmının daha fazlasını da bize gösterin.
rzetterberg

1
Herkes django dinlenme farklı Modelviewset kullandığınızda bu hatayı neden açıklıyor?
Amrit

1
basitçe: 'is_private' anahtarı mevcut değil!
ThePhi

Yanıtlar:


282

MultiValueDict getyöntemini kullanın . Bu, standart diktelerde de mevcuttur ve yoksa varsayılan değer sağlarken bir değer getirmenin bir yoludur.

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

Genellikle,

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

2
Bu bana hiçbiri değeri veriyor ama ben POST değeri gönderiyorum: /
Jesus Almaral - Hackaprende 26:17

Doğru davranıştır .. işaretlendiğinde onay kutusu gönder checked, ancak işaretli nulldeğilse gönderir . Bunu Chrome / Firefox DEV aracının "Ağ" panelinden kontrol edebilirsiniz. Bu nedenle Falsevarsayılan değer olarak ayarladınız : Varsa null, yapın false.
WesternGun

78

Sizin için en iyisini seçin:

1

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

is_privateRequest.POST öğesinde anahtar varsa , is_privatedeğişken ona eşit olur, değilse, False değerine eşit olur.

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
Gerçekten 3 numaralı tavsiye edemez.
Joe

6
Sadece istisna sisteminin kötüye kullanılması gibi görünüyor. İstisnalar istisnai davranışları ele almalıdır (yani, olabileceğini bildiğiniz ve başa çıkmanız gereken, ancak normal program akışında beklemediğiniz davranışlar). Bu durumda, istisna olası program akışlarının% 50'sinde atılır ve yakalanır. Buna yavaşlama da eklendi. Python'da nasıl çalıştığının ayrıntılarını bilmiyorum, ama pahalı bir yığın izinin dahil olacağını hayal ediyorum.
Joe

13
from django.utils.datastructures import MultiValueDictKeyError
Akseli Palén

8
@Joe - Python'da bu yaklaşım oldukça yaygın. İstisnayı yakalarsanız, otomatik olarak bir yığın izi oluşturmaz. docs.python.org/2/glossary.html#term-eafp
bjudson

9
3. adımda yanlış bir şey yok. Biz izin (EAFP) daha affetmek için daha kolay diyoruz ve Python şiddetle tavsiye kodlama tarzı. StackOverflow'daki birçok yayın bunu tartıştı.
Bobort

12

Bunu anlıyorsunuz çünkü orada olmadığında bir sözlükten bir anahtar almaya çalışıyorsunuz. Önce orada olup olmadığını test etmeniz gerekir.

Deneyin:

is_private = 'is_private' in request.POST

veya

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

kullandığınız değerlere bağlı olarak.


5

Neden is_privatemodellerinizde tanımlamaya çalışmadınız default=False?

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

2
Bu, POST değerini el ile kontrol etmekte olduğu hatayı önlemez.
Apollo Data

4

Hatırlanması gereken başka bir şey request.POST['keyword'], belirtilen html nameözniteliği tarafından tanımlanan öğeye atıfta bulunmasıdır keyword.

Yani, formunuz:

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

Daha sonra, request.POST['keyword']ve request.POST['results']giriş elemanları değerini içerir keywordve resultssırasıyla.


1

İlk olarak istek nesnesinin 'is_private' anahtar parametresine sahip olup olmadığını kontrol edin. Vaka çoğu bu MultiValueDictKeyError sözlük benzeri istek nesnesinde eksik anahtar nedeniyle meydana geldi. Sözlük sıralanmamış bir anahtar olduğundan, değer çifti “ilişkisel anılar” veya “ilişkisel diziler”

Başka bir ifadeyle. request.GET veya request.POST, tüm istek parametrelerini içeren sözlük benzeri bir nesnedir. Bu Django'ya özgüdür.

Eğer sözlükte anahtar varsa get () yöntemi verilen anahtar için bir değer döndürür. Anahtar kullanılamıyorsa, varsayılan değer Yok değerini döndürür.

Bu hatayı şu şekilde işleyebilirsiniz:

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

1

Benim için bu hata, django projemde aşağıdakilerden dolayı meydana geldi:

  1. Projemin şablonlar klasöründe bulunan home.html dosyasına şu şekilde yeni bir köprü ekledim:

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

  2. Views.py'de sayımın ve

   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 dosyasında aşağıdaki URL kalıplarım vardı:
    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"),
    ]

Hayır görüldüğü gibi. Yukarıdaki 3, son url düzeninde, yanlış views.count çağırırken, views.about çağırmak gerekiyordu. Bu fulltext = request.GET['fulltext']sayım işlevindeki sayım işlevi (urlpatterns'e yanlış giriş nedeniyle yanlışlıkla çağrıldı) views.py çoklu değer içeren anahtar hatası istisnasını attı.

Sonra urls.py'deki son url desenini doğru olana değiştirdim, yani path('about/',views.about,name="about")her şey yolunda gitti.

Görünüşe göre, genel olarak django'daki bir acemi programcı, bir url için yanlış bir şekilde başka bir görüntüleme işlevini çağırmaktan, farklı parametreler beklemek veya amaçlanan davranıştan ziyade render çağrısında farklı nesne kümesini iletmek gibi bir hata yapabilir.

Bu bazı acemi programcı django yardımcı olur umuyoruz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.