django MultiValueDictKeyError-fout, hoe ga ik ermee om

Ik probeer een object in mijn database op te slaan, maar het geeft een MultiValueDictKeyError-fout.

Het probleem ligt in het formulier, de is_privatewordt weergegeven door een selectievakje. Als het selectievakje NIET is ingeschakeld, wordt er uiteraard niets doorgegeven. Dit is waar de fout wordt weggegooid.

Hoe kan ik op de juiste manier met deze uitzondering omgaan en deze opvangen?

De regel is

is_private = request.POST['is_private']

Antwoord 1, autoriteit 100%

Gebruik de get-methode van MultiValueDict. Dit is ook aanwezig op standaard dictaten en is een manier om een waarde op te halen terwijl een standaardwaarde wordt opgegeven als deze niet bestaat.

is_private = request.POST.get('is_private', False)

Over het algemeen,

my_var = dict.get(<key>, <default>)

Antwoord 2, autoriteit 28%

Kies wat het beste bij u past:

1

is_private = request.POST.get('is_private', False);

Als de sleutel is_privateaanwezig is in request.POST, zal de variabele is_privatehieraan gelijk zijn, zo niet, dan is deze gelijk aan 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

Antwoord 3, autoriteit 4%

Dat krijg je omdat je een sleutel uit een woordenboek probeert te halen terwijl die er niet is. Je moet eerst testen of het erin zit.

probeer:

is_private = 'is_private' in request.POST

of

is_private = 'is_private' in request.POST and request.POST['is_private']

afhankelijk van de waarden die u gebruikt.


Antwoord 4, autoriteit 2%

Een ander ding om te onthouden is dat request.POST['keyword']verwijst naar het element dat wordt geïdentificeerd door het opgegeven html nameattribuut keyword.

Dus, als uw formulier is:

<form action="/login/" method="POST">
  <input type="text" name="keyword" placeholder="Search query">
  <input type="number" name="results" placeholder="Number of results">
</form>

vervolgens zullen request.POST['keyword']en request.POST['results']de waarde bevatten van de invoerelementen keyworden results, respectievelijk.


Antwoord 5, autoriteit 2%

Waarom heb je niet geprobeerd om is_privatein je modellen te definiëren als default=False?

class Foo(models.Models):
    is_private = models.BooleanField(default=False)

Antwoord 6

Voor mij trad deze fout op in mijn django-project vanwege het volgende:

  1. Ik heb een nieuwe hyperlink ingevoegd in mijn home.html aanwezig in de sjablonenmap van mijn project, zoals hieronder:

    <input type="button" value="About" onclick="location.href='{% url 'about' %}'">

    Antwoord 7

    Controleer eerst of het aanvraagobject de sleutelparameter ‘is_private’ heeft.
    In de meeste gevallen is deze MultiValueDictKeyError opgetreden voor ontbrekende
    sleutel in het woordenboekachtige aanvraagobject. Omdat woordenboek een
    ongeordende sleutel, waardepaar “associatieve herinneringen” of “associatieve
    arrays”

    In een ander woord. request.GET of request.POST is een woordenboek-achtige
    object dat alle verzoekparameters bevat. Dit is specifiek voor Django.

    De methode get() retourneert een waarde voor de gegeven sleutel als de sleutel zich in de . bevindt
    woordenboek. Als de sleutel niet beschikbaar is, wordt de standaardwaarde Geen geretourneerd.

    U kunt deze fout oplossen door :

    is_private = request.POST.get('is_private', False);
    

    Antwoord 8

    Ik kreeg de foutmelding ‘MultiValueDictKeyError’ tijdens het gebruik van ajax met Django. Gewoon vanwege het niet plaatsen van ‘#’ bij het selecteren van een element. Vind dit leuk.

    data:{ name : $('id_name').val(),},
    

    vervolgens zet ik de ‘#’ bij de id en het probleem is opgelost.

    data:{ name : $('#id_name').val(),},
    

    Antwoord 9

    Hiermee wordt een NULL-waarde ingevoegd als de naam niet aanwezig is in het verzoek

    name = request.data.get('name', None)
    

Other episodes