Python django MultiValueDictKeyError错误,如何处理
我正试图将一个对象保存到数据库中,但它抛出了一个Python django MultiValueDictKeyError错误,如何处理,python,django,exception,Python,Django,Exception,我正试图将一个对象保存到数据库中,但它抛出了一个多值dictKeyError错误 问题在于表单中,是私有的由一个复选框表示。如果未选中该复选框,则显然不会传递任何内容。这就是错误被丢弃的地方 如何正确处理此异常并捕获它 电话是 is_private = request.POST['is_private'] 你得到它是因为你试图从字典里得到一个键,而字典不在那里。你需要先测试它是否在那里 尝试: 或 根据您使用的值。选择最适合您的: 1. 如果请求中存在is_private密钥,则is_priv
多值dictKeyError
错误
问题在于表单中,是私有的
由一个复选框表示。如果未选中该复选框,则显然不会传递任何内容。这就是错误被丢弃的地方
如何正确处理此异常并捕获它
电话是
is_private = request.POST['is_private']
你得到它是因为你试图从字典里得到一个键,而字典不在那里。你需要先测试它是否在那里 尝试: 或
根据您使用的值。选择最适合您的: 1. 如果请求中存在
is_private
密钥,则is_private
变量将等于它,如果不是,则它将等于False
2.
3.
使用多值dict的
get
方法。这也出现在标准DICT上,是一种获取值的方法,同时提供默认值(如果不存在)
is_private = request.POST.get('is_private', False)
一般来说
my_var = dict.get(<key>, <default>)
my_var=dict.get(,)
为什么不在模型中将定义为default=False
class Foo(models.Models):
is_private = models.BooleanField(default=False)
首先检查请求对象是否具有“is_private”密钥参数。
大多数情况下,此多值错误都是由于缺少
输入类似于请求对象的字典。因为字典是一本书
无序键、值对“联想记忆”或“联想记忆”
阵列“
换句话说。request.GET或request.POST类似于字典
对象,该对象包含所有请求参数。这是针对Django的
如果键位于
字典。如果键不可用,则返回默认值None
您可以通过以下方式处理此错误:
is_private = request.POST.get('is_private', False);
另一件需要记住的事情是request.POST['keyword']
指的是由指定的htmlname
属性关键字
标识的元素
因此,如果您的表格是:
<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
的值。对于我来说,这个错误发生在django项目中,原因如下:
我在项目的templates文件夹中的my home.html中插入了一个新的超链接,如下所示:
一个好主意是向我们展示整个错误和跟踪。还向我们展示了引发错误的代码部分的更多内容。有人能解释为什么会发生此错误吗?我在django rest中使用不同的Modelviewset时看到了此错误……它的意思很简单:密钥“is_private”不存在!我真的不能推荐第三条。这似乎是对例外系统的滥用。异常应该用于处理异常行为(即,您知道可能发生并且必须处理的行为,但您在正常程序流中不希望发生的行为)。在这种情况下,异常将被抛出并捕获到50%的可能程序流中。再加上减速。我不知道它在Python中如何工作的细节,但我想可能会涉及昂贵的堆栈跟踪MultiValueDictKeyError@Joe-在Python中,这种方法非常常见。如果捕获异常,它不会自动生成stacktrace。第三步没有错。我们称之为“请求原谅比许可更容易”(EAFP),这是Python中极力推荐的编码风格。StackOverflow上的许多帖子甚至讨论过这一点。这并不能阻止他手动检查帖子的值时出现错误。这给了我一个无值,但我在帖子上发送值:/It是正确的行为。。复选框send选中时
处于选中状态,但如果未选中,则将发送null
。您可以在Chrome/Firefox开发工具的“网络”面板中检查这一点。这就是您将False
设置为默认值的原因:如果得到null
,则将其设置为False
。
is_private = request.POST.get('is_private', False)
my_var = dict.get(<key>, <default>)
class Foo(models.Models):
is_private = models.BooleanField(default=False)
is_private = request.POST.get('is_private', False);
<form action="/login/" method="POST">
<input type="text" name="keyword" placeholder="Search query">
<input type="number" name="results" placeholder="Number of results">
</form>