我正在尝试将对象保存到我的数据库,但它会导致MultiValueDictKeyError
错误。
问题出在表单中,is_private
由复选框表示。如果未选中该复选框,则显然不会传递任何内容。这就是错误消失的地方。
如何正确处理此异常并抓住它?
该行是
is_private = request.POST['is_private']
答案 0 :(得分:235)
使用MultiValueDict的get
方法。这也存在于标准dicts上,如果不存在,则提供默认值时提取值。
is_private = request.POST.get('is_private', False)
通常,
my_var = dict.get(<key>, <default>)
答案 1 :(得分:67)
选择最适合您的方式:
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
答案 2 :(得分:10)
你得到了,因为当你不在那里时,你正试图从字典中获取一个密钥。你需要先测试它是否在那里。
尝试:
is_private = 'is_private' in request.POST
或
is_private = 'is_private' in request.POST and request.POST['is_private']
取决于您正在使用的值。
答案 3 :(得分:5)
为什么不尝试将模型中的is_private
定义为default=False
?
class Foo(models.Models):
is_private = models.BooleanField(default=False)
答案 4 :(得分:2)
要记住的另一件事是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
的值。
答案 5 :(得分:0)
首先检查请求对象是否具有'is_private'键参数。 大多数情况下,MultiValueDictKeyError因缺失而发生 键入类似字典的请求对象。因为字典是一个 无序密钥,值对“关联记忆”或“关联记忆” 阵列”
换句话说。 request.GET或request.POST是一个字典 包含所有请求参数的对象。这是Django特有的。
如果key在,则get()方法返回给定键的值 字典。如果key不可用,则返回默认值None。
您可以通过执行以下操作来处理此错误:
is_private = request.POST.get('is_private', False);
答案 6 :(得分:0)
对我来说,由于以下原因,此错误在我的django项目中发生:
我在我的项目的模板文件夹中的home.html中插入了一个新的超链接,如下所示:
<input type="button" value="About" onclick="location.href='{% url '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的count函数中的这一行fulltext = request.GET['fulltext']
(由于在urlpatterns中输入错误而被错误地调用)抛出了multivaluedictkeyerror异常。
然后,我将urls.py中的最后一个URL模式更改为正确的模式,即path('about/',views.about,name="about")
,一切正常。
很明显,通常django中的新手程序员会犯这样的错误,即我错误地为url调用了另一个视图函数,这可能是期望使用不同的参数集或在其render调用中传递不同的对象集,而不是预期的行为。
希望这可以帮助一些新手程序员使用django。
答案 7 :(得分:0)
在 Django 中使用 ajax 时出现“MultiValueDictKeyError”错误。只是因为在选择元素时没有输入“#”。像这样。
data:{ name : $('id_name').val(),},
然后我把 '#' 和 id 放在一起,问题就解决了。
data:{ name : $('#id_name').val(),},
答案 8 :(得分:0)
如果名称不存在于请求中,这将插入 NULL 值
name = request.data.get('name', None)