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 !

331voto

adamnfish Points 2444

Utilisez l'outil MultiValueDict get méthode. Ceci est également présent sur les dicts standards et est un moyen de récupérer une valeur tout en fournissant une valeur par défaut si elle n'existe pas.

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

En général,

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

3 votes

Cela me donne une valeur nulle mais j'envoie la valeur sur le POST :/

1 votes

C'est le comportement correct envoi de la case à cocher checked lorsqu'il est coché mais enverra null si elle n'est pas cochée. Vous pouvez le vérifier dans le panneau "Réseau" de l'outil DEV de Chrome/Firefox. C'est pourquoi vous définissez False comme valeur par défaut : si on obtient null Faites-le. false .

94voto

Silver Light Points 9397

Choisissez ce qui est le mieux pour vous :

1

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

Si is_private est présente dans request.POST, la is_private la variable sera égale à elle, sinon, elle sera égale à Faux.

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

16 votes

Je ne peux vraiment pas recommander le numéro 3.

6 votes

Cela ressemble juste à un abus du système d'exception. Les exceptions doivent servir à gérer des comportements exceptionnels (c'est-à-dire des comportements dont on sait qu'ils peuvent se produire et auxquels on doit faire face, mais auxquels on ne s'attend pas dans le déroulement normal du programme). Dans ce cas, l'exception sera levée et rattrapée dans 50 % des flux de programme possibles. À cela s'ajoute le ralentissement. Je ne connais pas les détails du fonctionnement de Python, mais j'imagine qu'un suivi de pile coûteux est nécessaire.

14 votes

From django.utils.datastructures import MultiValueDictKeyError

13voto

Joe Points 18328

Vous obtenez cela parce que vous essayez d'obtenir une clé d'un dictionnaire alors qu'elle n'y est pas. Vous devez d'abord vérifier si elle s'y trouve.

essayez :

is_private = 'is_private' in request.POST

ou

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

en fonction des valeurs que vous utilisez.

7voto

Leo Points 41

Une autre chose à retenir est que request.POST['keyword'] fait référence à l'élément identifié par le html spécifié name attribut keyword .

Donc, si votre formulaire est :

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

alors, request.POST['keyword'] y request.POST['results'] contiendra la valeur des éléments d'entrée keyword y results respectivement.

6voto

Edson Dota Points 116

Pourquoi n'avez-vous pas essayé de définir is_private dans vos modèles comme default=False ?

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

2 votes

Cela n'empêcherait pas l'erreur qu'il obtient en vérifiant manuellement la valeur du POST.

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