Próbuję zapisać obiekt w mojej bazie danych, ale generuje MultiValueDictKeyError
błąd.
Problemy znajdują się w formularzu, is_private
oznaczono je polem wyboru. Jeśli pole wyboru NIE jest zaznaczone, oczywiście nic nie jest przekazywane. W tym miejscu błąd zostaje wyrzucony.
Jak prawidłowo poradzić sobie z tym wyjątkiem i go złapać?
Linia jest
is_private = request.POST['is_private']
Odpowiedzi:
Użyj metody MultiValueDict
get
. Jest to również obecne w standardowych dyktach i jest sposobem na pobranie wartości przy jednoczesnym zapewnieniu wartości domyślnej, jeśli nie istnieje.Ogólnie,
źródło
checked
gdy jest zaznaczone, ale wyśle,null
jeśli nie jest zaznaczone. Możesz to sprawdzić w panelu „Sieć” narzędzia Chrome / Firefox DEV. Dlatego ustawiaszFalse
jako wartość domyślną: jeśli masznull
, zrób tofalse
.Wybierz to, co jest dla Ciebie najlepsze:
1
Jeśli
is_private
klucz występuje w request.POST,is_private
zmienna będzie mu równa, jeśli nie, to będzie równa False.2
3
źródło
Otrzymujesz to, ponieważ próbujesz uzyskać klucz ze słownika, gdy go tam nie ma. Musisz najpierw sprawdzić, czy jest tam.
próbować:
lub
w zależności od używanych wartości.
źródło
Dlaczego nie próbowałeś zdefiniować
is_private
w swoich modelach jakodefault=False
?źródło
Inną rzeczą do zapamiętania jest to, że
request.POST['keyword']
odnosi się do elementu identyfikowanego przez określonyname
atrybut HTMLkeyword
.Jeśli więc Twój formularz to:
następnie,
request.POST['keyword']
irequest.POST['results']
będzie zawierać odpowiednio wartość elementów wejściowychkeyword
iresults
.źródło
Możesz obsłużyć ten błąd, umieszczając:
źródło
U mnie ten błąd wystąpił w moim projekcie django z następujących powodów:
Wstawiłem nowe hiperłącze do mojego home.html obecnego w folderze szablonów mojego projektu, jak poniżej:
W views.py miałem następujące definicje count i about:
Jak widać w nr. 3 powyżej, w ostatnim wzorcu adresu URL błędnie wywoływałem views.count, podczas gdy musiałem wywoływać views.about. Ta linia
fulltext = request.GET['fulltext']
funkcji count (która została błędnie wywołana z powodu błędnego wpisu w urlpatterns) views.py spowodowała wyjątek multivaluedictkeyerror.Następnie zmieniłem ostatni wzorzec adresu URL w urls.py na prawidłowy, tj.
path('about/',views.about,name="about")
I wszystko działało dobrze.Najwyraźniej początkujący programista w django może popełnić błąd, który popełniłem, błędnie wywołując inną funkcję widoku dla adresu URL, która może oczekiwać innego zestawu parametrów lub przekazywania innego zestawu obiektów w wywołaniu renderowania, zamiast zamierzonego zachowania.
Mam nadzieję, że pomoże to nowicjuszowi w django.
źródło