Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django MultiValueDictKeyError错误,如何处理_Python_Django_Exception - Fatal编程技术网

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']
指的是由指定的html
name
属性
关键字
标识的元素

因此,如果您的表格是:

<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>