web-dev-qa-db-fra.com

erreur django MultiValueDictKeyError, comment puis-je m'en occuper

J'essaie de sauvegarder un objet dans ma base de données, mais une erreur MultiValueDictKeyError est générée.

Le problème réside dans le formulaire, le is_private est représenté par une case à cocher. Si la case à cocher n'est PAS cochée, rien n'est évidemment passé. C'est là que l'erreur est jetée.

Comment puis-je gérer correctement cette exception et l'attraper? 

La ligne est

is_private = request.POST['is_private']
134
dotty

Utilisez la méthode get de MultiValueDict. Ceci est également présent sur les dessins standard et permet d'extraire une valeur tout en fournissant une valeur par défaut si elle n'existe pas.

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

Généralement,

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

Choisissez ce qui vous convient le mieux:

1

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

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

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
65
Silver Light

Vous obtenez cela parce que vous essayez d'obtenir une clé d'un dictionnaire alors que ce n'est pas là. Vous devez tester si c'est là en premier.

essayer:

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.

10
Joe

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

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

Une autre chose à garder à l'esprit est que request.POST['keyword'] fait référence à l'élément identifié par l'attribut html name spécifié 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'] et request.POST['results'] contiendront la valeur des éléments d’entrée keyword et results, respectivement.

2
Leo

Commencez par vérifier si l'objet de requête a le paramètre de clé 'is_private' . La plupart des cas, cette MultiValueDictKeyError s'est produite pour manquant clé dans l'objet de requête de type dictionnaire. Parce que le dictionnaire est un clé non ordonnée, paire de valeurs «mémoires associatives» ou «associative tableaux »

Dans un autre mot. request.GET ou request.POST est une sorte de dictionnaire objet contenant tous les paramètres de la demande. Ceci est spécifique à Django.

La méthode get () retourne une valeur pour la clé donnée si la clé est dans le dictionnaire. Si la clé n'est pas disponible, la valeur par défaut est None.

Vous pouvez gérer cette erreur en mettant:

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

Pour moi, cette erreur est survenue dans mon projet Django pour les raisons suivantes:

  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' %}'">

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

    1. 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 no. 3 ci-dessus, dans le dernier modèle d’URL, j’appelais incorrectement views.count, alors que j’avais besoin d’appeler views.about. Cette ligne fulltext = request.GET['fulltext'] dans la fonction de comptage (appelée à tort en raison d’une mauvaise entrée dans urlpatterns) de views.py a lancé l’exception multivaluedictkeyerror.

Ensuite, j’ai changé le dernier modèle d’URL dans urls.py en le correct, c’est-à-dire path('about/',views.about,name="about"), et tout a bien fonctionné.

Apparemment, en général, un programmeur débutant dans Django peut commettre l’erreur que j’ai faite d’appeler à tort une autre fonction de vue pour une adresse URL, ce qui peut attendre différents ensembles de paramètres ou transmettre différents ensembles d’objets dans son rendu, plutôt que le comportement souhaité.

J'espère que cela aidera certains programmeurs débutants à Django.

0
TNT