Estou tentando salvar um objeto no meu banco de dados, mas está gerando um MultiValueDictKeyError
erro.
Os problemas estão no formulário, o is_private
é representado por uma caixa de seleção. Se a caixa de seleção NÃO estiver selecionada, obviamente nada será passado. É aqui que o erro é descartado.
Como faço para lidar adequadamente com essa exceção e capturá-la?
A linha é
is_private = request.POST['is_private']
Respostas:
Use o
get
método do MultiValueDict . Isso também está presente nos dictos padrão e é uma maneira de buscar um valor e fornecer um padrão se ele não existir.Geralmente,
fonte
checked
quando está marcada, mas envianull
se não estiver marcada. Você pode verificar isso no painel "Rede" da ferramenta Chrome / Firefox DEV. É por isso que você defineFalse
como o valor padrão: se obtidonull
, faça-ofalse
.Escolha o que é melhor para você:
1
Se a
is_private
chave estiver presente em request.POST, ais_private
variável será igual a ela, caso contrário, será igual a False.2
3
fonte
Você entende isso porque está tentando obter uma chave de um dicionário quando ele não está lá. Você precisa testar se está lá primeiro.
experimentar:
ou
dependendo dos valores que você está usando.
fonte
Por que você não tentou definir
is_private
em seus modelos comodefault=False
?fonte
Outra coisa a lembrar é que
request.POST['keyword']
se refere ao elemento identificado peloname
atributo html especificadokeyword
.Portanto, se seu formulário for:
então,
request.POST['keyword']
erequest.POST['results']
conterá o valor dos elementos de entradakeyword
eresults
, respectivamente.fonte
Você pode lidar com esse erro colocando:
fonte
Para mim, esse erro ocorreu no meu projeto django devido ao seguinte:
Inseri um novo hiperlink em meu home.html presente na pasta de modelos do meu projeto, como abaixo:
No views.py, eu tinha as seguintes definições de count e about:
Como pode ser visto no n. 3 acima, no último padrão de URL, eu estava chamando incorretamente o views.count, enquanto eu precisava chamá-lo. A
fulltext = request.GET['fulltext']
função line in count (que foi chamada erroneamente por causa da entrada incorreta nos padrões de URL) do views.py lançou a exceção multivaluedictkeyerror.Então mudei o último padrão de URL em urls.py para o correto
path('about/',views.about,name="about")
, ou seja , e tudo funcionou bem.Aparentemente, em geral, um programador iniciante no django pode cometer o erro que cometi ao chamar outra função de visualização para um URL, o que pode estar esperando um conjunto diferente de parâmetros ou passando um conjunto diferente de objetos em sua chamada de renderização, em vez do comportamento pretendido.
Espero que isso ajude algum programador iniciante no django.
fonte