[英]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>)
选择最适合您的:
is_private = request.POST.get('is_private', False);
如果在 request.POST 中存在is_private
密钥,则is_private
变量将等于它,如果不存在,那么它将等于 False。
if 'is_private' in request.POST:
is_private = request.POST['is_private']
else:
is_private = False
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']
将分别包含输入元素keyword
和results
的值。
您为什么不尝试在模型中将is_private
定义为default=False
?
class Foo(models.Models):
is_private = models.BooleanField(default=False)
对我来说,这个错误发生在我的 django 项目中,原因如下:
我在我的主页中插入了一个新的超链接。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")
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.