我试图保存一个对象到我的数据库,但它抛出MultiValueDictKeyError错误。
MultiValueDictKeyError
问题在于表单,is_private由复选框表示。如果复选框未被选中,显然不会传递任何信息。这是错误被丢弃的地方。
is_private
我如何正确地处理这个异常,并捕获它?
这条线是
is_private = request.POST['is_private']
你得到这个是因为你试图从字典中获取一个键,而它并不在那里。你需要先测试它是否在那里。
试一试:
is_private = 'is_private' in request.POST
或
is_private = 'is_private' in request.POST and request.POST['is_private']
这取决于你所使用的值。
选择最适合你的:
is_private = request.POST.get('is_private', False);
如果请求中存在is_private键。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
使用MultiValueDict的get方法。这也出现在标准字典中,是一种获取值的方法,同时在不存在时提供默认值。
get
is_private = request.POST.get('is_private', False)
一般来说,
my_var = dict.get(<key>, <default>)
你为什么不试着在你的模型中定义is_private为default=False?
default=False
class Foo(models.Models): is_private = models.BooleanField(default=False)
首先检查请求对象是否有“is_private”密钥参数。 大多数情况下,这个MultiValueDictKeyError发生在missing 输入类似字典的请求对象。因为字典是 无序键、值对“联想记忆”或“联想记忆” 数组" < / p > 换句话说。请求。GET或request。POST类似于字典 对象,其中包含所有请求参数。 方法get()返回给定键的值,如果键在 字典。如果key不可用,则返回默认值None
换句话说。请求。GET或request。POST类似于字典 对象,其中包含所有请求参数。
你可以这样处理这个错误:
另一件要记住的事情是,request.POST['keyword']指的是由指定的html name属性keyword标识的元素。
request.POST['keyword']
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的值。
request.POST['results']
results
对我来说,这个错误发生在我的django项目中,因为以下原因:
<input type="button" value="About" onclick="location.href='{% url 'about' %}'">
In views.py, I had the following definitions of count and 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"), ]
从no。上面3,在最后一个url模式中,我错误地调用了视图。count,而我需要调用views.about。 views.py的count函数中的fulltext = request.GET['fulltext'](由于urlpatterns中的错误条目而被错误调用)抛出multivaluedictkeyerror异常
fulltext = request.GET['fulltext']
然后我将urls.py中的最后一个url模式更改为正确的,即path('about/',views.about,name="about"),一切正常工作。
path('about/',views.about,name="about")
显然,一般来说,django的新手程序员会犯我犯的错误,错误地为url调用另一个视图函数,这可能是期望不同的参数集或在其渲染调用中传递不同的对象集,而不是预期的行为。
希望这能帮助一些新手程序员使用django。
我得到了'MultiValueDictKeyError'错误,而使用ajax与Django。只是因为在选择元素时没有输入“#”。像这样。
data:{ name : $('id_name').val(),},
然后我把'#'与id和问题解决了。
data:{ name : $('#id_name').val(),},
如果请求中没有名称,将插入NULL值
name = request.data.get('name', None)