Ich versuche, ein Objekt in meiner Datenbank zu speichern, aber es wird ein MultiValueDictKeyError
-Fehler ausgegeben.
Das Problem liegt im Formular, der is_private
wird durch ein Kontrollkästchen dargestellt. Wenn das Kontrollkästchen NICHT aktiviert ist, wird offensichtlich nichts übergeben. Hier wird der Fehler eingeklemmt.
Wie gehe ich richtig mit dieser Ausnahme um und fange sie ein?
Die Linie ist
is_private = request.POST['is_private']
Verwenden Sie die get
-Methode von MultiValueDict. Dies ist auch in Standarddiagrammen vorhanden und bietet eine Möglichkeit, einen Wert abzurufen und einen Standardwert anzugeben, falls er nicht vorhanden ist.
is_private = request.POST.get('is_private', False)
Allgemein,
my_var = dict.get(<key>, <default>)
Wählen Sie aus, was für Sie am besten ist:
is_private = request.POST.get('is_private', False);
Wenn der Schlüssel is_private
in request.POST vorhanden ist, ist die Variable is_private
gleich, wenn nicht, ist sie gleich 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
Sie bekommen das, weil Sie versuchen, einen Schlüssel aus einem Wörterbuch zu bekommen, wenn es nicht vorhanden ist. Sie müssen zuerst testen, ob es dort drin ist.
versuchen:
is_private = 'is_private' in request.POST
oder
is_private = 'is_private' in request.POST and request.POST['is_private']
abhängig von den verwendeten Werten.
Warum haben Sie nicht versucht, is_private
in Ihren Modellen als default=False
zu definieren?
class Foo(models.Models):
is_private = models.BooleanField(default=False)
Beachten Sie auch, dass request.POST['keyword']
sich auf das Element bezieht, das durch das angegebene html name
-Attribut keyword
identifiziert wird.
Wenn Ihr Formular also lautet:
<form action="/login/" method="POST">
<input type="text" name="keyword" placeholder="Search query">
<input type="number" name="results" placeholder="Number of results">
</form>
dann enthalten request.POST['keyword']
und request.POST['results']
den Wert der Eingabeelemente keyword
und results
.
Prüfen Sie zunächst, ob das Anforderungsobjekt den Schlüsselparameter 'is_private' hat . In den meisten Fällen ist dieser MultiValueDictKeyError für das Fehlen von .__ aufgetreten. Geben Sie das wörterbuchartige Anforderungsobjekt ein. Weil das Wörterbuch ein .__ ist. ungeordneter Schlüssel, Wertepaar "assoziative Speicher" oder "assoziativ Arrays ”
In einem anderen Wort. request.GET oder request.POST ist ein wörterbuchähnliches Objekt, das alle Anforderungsparameter enthält. Dies ist spezifisch für Django.
Die Methode get () gibt einen Wert für den angegebenen Schlüssel zurück, wenn sich der Schlüssel in der .__ befindet. Wörterbuch. Wenn der Schlüssel nicht verfügbar ist, wird der Standardwert Keiner zurückgegeben.
Sie können diesen Fehler behandeln, indem Sie Folgendes eingeben:
is_private = request.POST.get('is_private', False);
Für mich ist dieser Fehler in meinem Django-Projekt auf Folgendes zurückzuführen:
Ich habe einen neuen Hyperlink in meine home.html im Vorlagenordner meines Projekts eingefügt:
<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"),
]
Wie man in Nr. Sehen kann. 3 oben, im letzten URL-Muster, rief ich views.count falsch an, wohingegen ich Views.out aufrufen musste. Diese Zeile fulltext = request.GET['fulltext']
in der count-Funktion (die fälschlicherweise wegen falscher Eingabe in urlpatterns aufgerufen wurde) von views.py hat die multivaluedictkeyerror-Ausnahme ausgelöst.
Dann habe ich das letzte URL-Muster in urls.py in das richtige geändert, d. H. path('about/',views.about,name="about")
, und alles hat gut funktioniert.
Anscheinend kann ein Neuling-Programmierer in Django im Allgemeinen den Fehler begehen, den ich falsch gemacht habe, als er eine andere View-Funktion für eine URL falsch aufgerufen hat, die einen anderen Satz von Parametern erwartet oder einen anderen Satz von Objekten in ihrem Renderaufruf als das beabsichtigte Verhalten übergibt.
Hoffe, das hilft einigen Neuling-Programmierern zu Django.