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']
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>)
Choisissez ce qui vous convient le mieux:
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.
if 'is_private' in request.POST:
is_private = request.POST['is_private']
else:
is_private = False
from Django.utils.datastructures import MultiValueDictKeyError
try:
is_private = request.POST['is_private']
except MultiValueDictKeyError:
is_private = False
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.
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)
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.
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);
Pour moi, cette erreur est survenue dans mon projet Django pour les raisons suivantes:
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' %}'">
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")
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.