django MultiValueDictKeyError错误,我该如何处理它

时间:2011-05-05 09:40:15

标签: python django exception

我正在尝试将对象保存到我的数据库,但它会导致MultiValueDictKeyError错误。

问题出在表单中,is_private由复选框表示。如果未选中该复选框,则显然不会传递任何内容。这就是错误消失的地方。

如何正确处理此异常并抓住它?

该行是

is_private = request.POST['is_private']

9 个答案:

答案 0 :(得分:235)

使用MultiValueDict的get方法。这也存在于标准dicts上,如果不存在,则提供默认值时提取值。

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

通常,

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

答案 1 :(得分:67)

选择最适合您的方式:

1

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

如果request.POST中存在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

答案 2 :(得分:10)

你得到了,因为当你不在那里时,你正试图从字典中获取一个密钥。你需要先测试它是否在那里。

尝试:

is_private = 'is_private' in request.POST

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

取决于您正在使用的值。

答案 3 :(得分:5)

为什么不尝试将模型中的is_private定义为default=False

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

答案 4 :(得分:2)

要记住的另一件事是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的值。

答案 5 :(得分:0)

  

首先检查请求对象是否具有'is_private'键参数。   大多数情况下,MultiValueDictKeyError因缺失而发生   键入类似字典的请求对象。因为字典是一个   无序密钥,值对“关联记忆”或“关联记忆”   阵列”

     

换句话说。 request.GET或request.POST是一个字典   包含所有请求参数的对象。这是Django特有的。

     

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

您可以通过执行以下操作来处理此错误:

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

答案 6 :(得分:0)

对我来说,由于以下原因,此错误在我的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中,我具有以下网址格式:

    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。 views.py的count函数中的这一行fulltext = request.GET['fulltext'](由于在urlpatterns中输入错误而被错误地调用)抛出了multivaluedictkeyerror异常。

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

很明显,通常django中的新手程序员会犯这样的错误,即我错误地为url调用了另一个视图函数,这可能是期望使用不同的参数集或在其render调用中传递不同的对象集,而不是预期的行为。

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

答案 7 :(得分:0)

在 Django 中使用 ajax 时出现“MultiValueDictKeyError”错误。只是因为在选择元素时没有输入“#”。像这样。

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

然后我把 '#' 和 id 放在一起,问题就解决了。

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

答案 8 :(得分:0)

如果名称不存在于请求中,这将插入 NULL 值

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