212 votes

erreur MultiValueDictKeyError de django, comment la traiter ?

J'essaie de sauvegarder un objet dans ma base de données, mais une erreur MultiValueDictKeyError se produit.

Le problème se situe dans le formulaire, l'option is_private est représentée par une case à cocher. Si la case à cocher n'est PAS sélectionnée, rien n'est évidemment transmis. C'est là que l'erreur se produit.

Comment puis-je traiter correctement cette exception et l'attraper ?

La ligne est

is_private = request.POST['is_private']

Remerciez

1 votes

Une bonne idée serait de nous montrer l'erreur complète et la trace. Montrez-nous également plus de la portion de code où l'erreur est soulevée.

1 votes

Quelqu'un peut-il expliquer pourquoi cette erreur se produit ? J'ai vu cette erreur lorsque j'utilise différents Modelviewset dans django rest......

1 votes

Cela signifie simplement que la clé 'is_private' n'existe pas !

4voto

TNT Points 156

Pour moi, cette erreur s'est produite dans mon projet django à cause de ce qui suit :

  1. J'ai inséré un nouveau lien hypertexte dans mon home.html présent dans le dossier templates de mon projet comme ci-dessous :

    <input type="button" value="About" onclick="location.href='{% url 'about' %}'">
  2. Dans views.py, j'avais les définitions suivantes de count et about :

    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")

  3. Dans urls.py, j'avais les modèles d'url suivants :

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

Comme on peut le voir dans le n°3 ci-dessus, dans le dernier motif url, j'appelais de manière incorrecte views.count alors que je devais appeler views.about. Cette ligne fulltext = request.GET['fulltext'] dans la fonction count (qui a été appelée par erreur en raison d'une entrée erronée dans urlpatterns) de views.py a déclenché l'exception multivaluedictkeyerror.

Ensuite, j'ai changé le dernier modèle d'url dans urls.py par le modèle correct, à savoir path('about/',views.about,name="about") et tout a bien fonctionné.

Apparemment, en général, un programmeur débutant en django peut faire l'erreur que j'ai faite en appelant à tort une autre fonction de vue pour une url, qui pourrait attendre un ensemble différent de paramètres ou passer un ensemble différent d'objets dans son appel de rendu, plutôt que le comportement prévu.

J'espère que cela aidera les programmeurs débutants à découvrir django.

3voto

Projesh Bhoumik Points 357

Vérifiez d'abord si l'objet de la requête contient le paramètre de clé 'is_private'. Dans la plupart des cas, cette erreur MultiValueDictKeyError est due à une clé manquante dans l'objet de requête de type dictionnaire. dans l'objet de requête de type dictionnaire. Parce que le dictionnaire est une clé non ordonnée, la paire de valeurs est une "mémoire associative" ou un "tableau associatif". tableaux".

En d'autres termes, request.GET ou request.POST est un objet de type dictionnaire contenant tous les paramètres de la requête. Ceci est spécifique à Django.

La méthode get() renvoie une valeur pour la clé donnée si celle-ci se trouve dans le dictionnaire. Si la clé n'est pas disponible, elle renvoie la valeur par défaut None.

Vous pouvez gérer cette erreur en mettant :

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

0voto

Rubel Points 332

J'ai obtenu l'erreur 'MultiValueDictKeyError' en utilisant ajax avec Django. Juste parce que je n'ai pas mis '#' en sélectionnant un élément. Comme ceci.

data:{ name : $('id_name').val(),},

alors je mets le '#' avec l'id et le problème est résolu.

data:{ name : $('#id_name').val(),},

0voto

Bairu Points 45

Ceci insérera une valeur NULL si le nom n'est pas présent dans la requête.

name = request.data.get('name', None)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X