我正在尝试将对象保存到数据库中,但是它引发了MultiValueDictKeyError
错误。
问题出在表格内,is_private
用一个复选框表示。如果未选中该复选框,则显然不会传递任何内容。这是消除错误的地方。
我如何正确处理并捕获此异常?
该行是
is_private = request.POST['is_private']
我正在尝试将对象保存到数据库中,但是它引发了MultiValueDictKeyError
错误。
问题出在表格内,is_private
用一个复选框表示。如果未选中该复选框,则显然不会传递任何内容。这是消除错误的地方。
我如何正确处理并捕获此异常?
该行是
is_private = request.POST['is_private']
Answers:
使用MultiValueDict的get
方法。这在标准字典中也存在,并且是一种在不存在默认值的情况下获取值的方法。
is_private = request.POST.get('is_private', False)
通常,
my_var = dict.get(<key>, <default>)
checked
在选中时发送,但null
在未选中时发送。您可以在Chrome / Firefox DEV工具的“网络”面板中进行检查。这就是为什么你设置False
为默认值:如果有null
,使它false
。
选择最适合您的:
is_private = request.POST.get('is_private', False);
如果is_private
key在request.POST中存在,则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
在模型中定义为default=False
?
class Foo(models.Models):
is_private = models.BooleanField(default=False)
要记住的另一件事是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'键参数。多数情况下,此MultiValueDictKeyError发生是因为类字典的请求对象中缺少键。由于字典是无序键,因此值对为“关联存储器”或“关联数组”
换句话说。request.GET或request.POST是类似于字典的对象,包含所有请求参数。这是特定于Django的。
如果key在字典中,则方法get()返回给定key的值。如果key不可用,则返回默认值None。
您可以通过以下方式处理此错误:
is_private = request.POST.get('is_private', False);
对我而言,由于以下原因,此错误在我的django项目中发生:
我在项目的模板文件夹中的home.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。fulltext = request.GET['fulltext']
views.py的count函数中的这一行(由于在urlpatterns中输入错误而被错误地调用)引发了multivaluedictkeyerror异常。
然后,我将urls.py中的最后一个URL模式更改为正确的模式,即path('about/',views.about,name="about")
,一切正常。
显然,通常django中的新手程序员会犯这样的错误,即我错误地为URL调用了另一个视图函数,这可能是期望使用不同的参数集或在其render调用中传递不同的对象集,而不是预期的行为。
希望这可以帮助一些新手程序员使用django。