django MultiValueDictKeyError 错误,我该如何处理
Posted
技术标签:
【中文标题】django MultiValueDictKeyError 错误,我该如何处理【英文标题】:django MultiValueDictKeyError error, how do I deal with it 【发布时间】:2011-08-19 05:31:47 【问题描述】:我正在尝试将一个对象保存到我的数据库中,但它抛出了 MultiValueDictKeyError
错误。
问题在于表单,is_private
由复选框表示。如果未选中该复选框,则显然没有通过任何内容。这就是错误被丢弃的地方。
我如何正确处理这个异常并捕获它?
线是
is_private = request.POST['is_private']
【问题讨论】:
一个好主意是向我们展示整个错误和跟踪。还向我们展示更多引发错误的代码部分。 谁能解释为什么会出现这个错误?我在 django rest 中使用不同的 Modelviewset 时看到了这个错误..... 它的意思很简单:密钥'is_private'不存在! 【参考方案1】:使用 MultiValueDict 的 get
方法。这也存在于标准 dicts 中,是一种获取值的方法,同时在不存在时提供默认值。
is_private = request.POST.get('is_private', False)
一般来说
my_var = dict.get(<key>, <default>)
【讨论】:
这给了我一个 None 值,但我在 POST 上发送值:/ 这是正确的行为..复选框在选中时发送checked
,但如果未选中将发送null
。您可以在 Chrome/Firefox DEV 工具的“网络”面板中检查这一点。这就是为什么您将False
设置为默认值:如果得到null
,则设为false
。【参考方案2】:
选择最适合您的:
1
is_private = request.POST.get('is_private', False);
如果is_private
键存在于 request.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
【讨论】:
实在不能推荐3号。 这似乎是对异常系统的滥用。异常应该用于处理异常行为(即您知道可能发生并且必须处理但您在正常程序流程中不期望的行为)。在这种情况下,将在 50% 的可能程序流中抛出并捕获异常。除此之外,还有减速。我不知道它在 Python 中如何工作的细节,但我想会涉及到昂贵的堆栈跟踪。 从 django.utils.datastructures 导入 MultiValueDictKeyError @Joe - 在 Python 中,这种方法很常见。如果您捕捉到异常,它不会自动生成堆栈跟踪。 docs.python.org/2/glossary.html#term-eafp 第 3 步没有任何问题。我们称之为“请求宽恕比许可更容易”(EAFP),它是 Python 中强烈推荐的编码风格。 *** 上的很多帖子甚至都讨论过这个问题。【参考方案3】:你得到这个是因为你试图从字典中获取一个不存在的键。您需要先测试它是否在那里。
尝试:
is_private = 'is_private' in request.POST
或
is_private = 'is_private' in request.POST and request.POST['is_private']
取决于您使用的值。
【讨论】:
【参考方案4】:另外要记住的是request.POST['keyword']
指的是由指定的htmlname
属性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
的值。
【讨论】:
【参考方案5】:您为什么不尝试在模型中将is_private
定义为default=False
?
class Foo(models.Models):
is_private = models.BooleanField(default=False)
【讨论】:
这不会阻止他手动检查 POST 以获取值的错误。【参考方案6】:对我来说,这个错误发生在我的 django 项目中,原因如下:
我在我的项目模板文件夹中的 home.html 中插入了一个新的超链接,如下所示:
<input type="button" value="About" onclick="location.href='% url 'about' %'">
在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")
-
在 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。
views.py的count函数中fulltext = request.GET['fulltext']
这一行(由于urlpatterns输入错误而被错误调用)抛出了multivaluedictkeyerror异常。
然后我将 urls.py 中的最后一个 url 模式更改为正确的模式,即path('about/',views.about,name="about")
,一切正常。
显然,一般来说,django 的新手程序员可能会犯我所犯的错误,即错误地为 url 调用另一个视图函数,这可能期望不同的参数集或在其渲染调用中传递不同的对象集,而不是预期的行为。
希望这有助于一些新手程序员使用 django。
【讨论】:
【参考方案7】:首先检查请求对象是否有'is_private'键参数。 大多数情况下的这个 MultiValueDictKeyError 是因为丢失而发生的 类字典请求对象中的键。因为字典是一个 无序键、值对“联想记忆”或“联想记忆” 数组”
换句话说。 request.GET 或 request.POST 类似于字典 包含所有请求参数的对象。这是 Django 特有的。
如果 key 在 字典。如果 key 不可用,则返回默认值 None。
你可以通过输入来处理这个错误:
is_private = request.POST.get('is_private', False);
【讨论】:
【参考方案8】:在 Django 中使用 ajax 时出现“MultiValueDictKeyError”错误。只是因为在选择元素时没有输入“#”。像这样。
data: name : $('id_name').val(),,
然后我把'#'和id放在一起,问题就解决了。
data: name : $('#id_name').val(),,
【讨论】:
【参考方案9】:如果请求中不存在名称,这将插入 NULL 值
name = request.data.get('name', None)
【讨论】:
以上是关于django MultiValueDictKeyError 错误,我该如何处理的主要内容,如果未能解决你的问题,请参考以下文章