django MultiValueDictKeyError ошибка, как мне с ней справиться - PullRequest
146 голосов
/ 05 мая 2011

Я пытаюсь сохранить объект в своей базе данных, но выдает ошибку MultiValueDictKeyError.

Проблемы лежат в форме, is_private представлен флажком. Если флажок НЕ установлен, очевидно, ничего не пропущено. Вот где ошибка забрасывается.

Как мне правильно разобраться с этим исключением и поймать его?

Линия

is_private = request.POST['is_private']

Ответы [ 7 ]

241 голосов
/ 05 мая 2011

Используйте метод MultiValueDict get. Это также присутствует в стандартных диктовках и является способом извлечения значения при обеспечении значения по умолчанию, если оно не существует.

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

Вообще,

my_var = dict.get(<key>, <default>)
68 голосов
/ 05 мая 2011

Выберите, что лучше для вас:

1

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

Если в запросе присутствует ключ is_private. ПОСТ переменная is_private будет равна ей, если неттогда оно будет равно 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
10 голосов
/ 05 мая 2011

Вы получаете это, потому что вы пытаетесь получить ключ из словаря, когда его там нет. Вы должны проверить, находится ли он там первым.

попробовать:

is_private = 'is_private' in request.POST

или

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

в зависимости от используемых вами значений.

5 голосов
/ 13 августа 2013

Почему вы не попытались определить is_private в своих моделях как default=False?

class Foo(models.Models):
    is_private = models.BooleanField(default=False)
2 голосов
/ 06 июля 2018

Также следует помнить, что request.POST['keyword'] относится к элементу, идентифицированному указанным атрибутом html name keyword.

Итак, если ваша форма:

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

тогда request.POST['keyword'] и request.POST['results'] будут содержать значения входных элементов keyword и results соответственно.

0 голосов
/ 27 января 2019

Для меня эта ошибка произошла в моем проекте django из-за следующего:

  1. Я вставил новую гиперссылку в свой home.html подарок в папке шаблонов моего проекта, как показано ниже:

    <input type="button" value="About" onclick="location.href='{% url 'about' %}'">
    1. В views.py у меня были следующие определения count и 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. В urls.py у меня были следующие шаблоны URL:

    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"), ]

Как видно из №. 3 выше, в последнем шаблоне URL я неправильно вызывал views.count, тогда как мне нужно было вызвать views.about. Эта строка fulltext = request.GET['fulltext'] в функции count (которая была вызвана по ошибке из-за неправильной записи в urlpatterns) views.py вызвала исключение multivaluedictkeyerror.

Затем я изменил последний шаблон URL в urls.py на правильный, то есть path('about/',views.about,name="about"), и все заработало нормально.

Очевидно, в общем, программист-новичок в django может совершить ошибку, которую я допустил из-за неправильного вызова другой функции представления для URL-адреса, которая может ожидать другой набор параметров или передавать другой набор объектов в своем вызове рендеринга, а не предполагаемое поведение.

Надеюсь, это поможет начинающему программисту в django.

0 голосов
/ 06 мая 2018

Сначала проверьте, имеет ли объект запроса параметр ключа is_private. В большинстве случаев этот MultiValueDictKeyError произошел за отсутствием введите словарь как объект запроса. Потому что словарь неупорядоченный ключ, пара значений «ассоциативные воспоминания» или «ассоциативный» Массивы»

Другими словами. request.GET или request.POST - словарь объект, содержащий все параметры запроса. Это специфично для Джанго.

Метод get () возвращает значение для данного ключа, если ключ находится в толковый словарь. Если ключ недоступен, возвращается значение по умолчанию Нет.

Вы можете исправить эту ошибку, набрав:

is_private = request.POST.get('is_private', False);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...