繁体   English   中英

django MultiValueDictKeyError 错误,我该如何处理

[英]django MultiValueDictKeyError error, how do I deal with it

我正在尝试将 object 保存到我的数据库中,但它引发了MultiValueDictKeyError错误。

问题在于表单, is_private由复选框表示。 如果未选中该复选框,则显然没有通过任何内容。 这就是错误被丢弃的地方。

如何正确处理此异常并捕获它?

这条线是

is_private = request.POST['is_private']

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

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

一般来说,

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

选择最适合您的:

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

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

尝试:

is_private = 'is_private' in request.POST

或者

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

取决于您使用的值。

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

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

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

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

  1. 我在我的主页中插入了一个新的超链接。html 出现在我的项目的模板文件夹中,如下所示:

     <input type="button" value="About" onclick="location.href='{% url 'about' %}'">

  2. 在 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 中,我有以下 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 的这一行fulltext = request.GET['fulltext'] in count function(由于 urlpatterns 中的错误条目而被错误地调用)引发了 multivaluedictkeyerror 异常。

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

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

希望这对 django 的一些新手程序员有所帮助。

首先检查请求 object 是否有 'is_private' 密钥参数。 大多数情况下,这种 MultiValueDictKeyError 发生在类字典请求 object 中缺少键。 因为字典是无序键,值对“关联记忆”或“关联数组”

换句话说。 request.GET 或 request.POST 是一个类似于字典的 object 包含所有请求参数。 这特定于 Django。

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

您可以通过放置以下内容来处理此错误:

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM