django MultiValueDictKeyError错误,我如何处理它

我试图保存一个对象到我的数据库,但它抛出MultiValueDictKeyError错误。

问题在于表单,is_private由复选框表示。如果复选框未被选中,显然不会传递任何信息。这是错误被丢弃的地方。

我如何正确地处理这个异常,并捕获它?

这条线是

is_private = request.POST['is_private']
393932 次浏览

你得到这个是因为你试图从字典中获取一个键,而它并不在那里。你需要先测试它是否在那里。

试一试:

is_private = 'is_private' in request.POST

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

这取决于你所使用的值。

选择最适合你的:

1

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

如果请求中存在is_private键。POST 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

使用MultiValueDict的get方法。这也出现在标准字典中,是一种获取值的方法,同时在不存在时提供默认值。

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

一般来说,

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

你为什么不试着在你的模型中定义is_privatedefault=False?

class Foo(models.Models):
is_private = models.BooleanField(default=False)
首先检查请求对象是否有“is_private”密钥参数。 大多数情况下,这个MultiValueDictKeyError发生在missing 输入类似字典的请求对象。因为字典是 无序键、值对“联想记忆”或“联想记忆” 数组" < / p >

换句话说。请求。GET或request。POST类似于字典 对象,其中包含所有请求参数。

方法get()返回给定键的值,如果键在 字典。如果key不可用,则返回默认值None

你可以这样处理这个错误:

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

另一件要记住的事情是,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']将分别包含输入元素keywordresults的值。

对我来说,这个错误发生在我的django项目中,因为以下原因:

    我在我的home.html中插入了一个新的超链接,在我的项目的模板文件夹中,如下所示:
    <input type="button" value="About" onclick="location.href='{% url 'about' %}'">

  1. In views.py, I had the following definitions of count and 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"),
]

从no。上面3,在最后一个url模式中,我错误地调用了视图。count,而我需要调用views.about。 views.py的count函数中的fulltext = request.GET['fulltext'](由于urlpatterns中的错误条目而被错误调用)抛出multivaluedictkeyerror异常

然后我将urls.py中的最后一个url模式更改为正确的,即path('about/',views.about,name="about"),一切正常工作。

显然,一般来说,django的新手程序员会犯我犯的错误,错误地为url调用另一个视图函数,这可能是期望不同的参数集或在其渲染调用中传递不同的对象集,而不是预期的行为。

希望这能帮助一些新手程序员使用django。

我得到了'MultiValueDictKeyError'错误,而使用ajax与Django。只是因为在选择元素时没有输入“#”。像这样。

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

然后我把'#'与id和问题解决了。

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

如果请求中没有名称,将插入NULL值

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