wake-up-neo.com

django MultiValueDictKeyError-Fehler, wie gehe ich damit um

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']
134
dotty

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>)
225
adamnfish

Wählen Sie aus, was für Sie am besten ist:

1

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.

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

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.

10
Joe

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)
5
Edson Dota

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.

2
Leo

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);
0
Projesh Bhoumik

Für mich ist dieser Fehler in meinem Django-Projekt auf Folgendes zurückzuführen:

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

    1. In views.py hatte ich die folgenden Definitionen von count und 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. In urls.py hatte ich folgende URL-Muster:

    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.

0
TNT