我试图保存一个对象到我的数据库,但它抛出一个MultiValueDictKeyError错误。

问题在于表单,is_private是由一个复选框表示的。如果复选框未被选中,显然不会传递任何信息。这是错误被丢弃的地方。

我如何正确地处理这个异常,并捕获它?

这条线是

is_private = request.POST['is_private']

当前回答

对我来说,这个错误发生在我的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")

在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模式中,我错误地调用了视图。count,而我需要调用views.about。 这一行fulltext = request。view .py的count函数中的GET['fulltext'](由于urlpatterns中的错误条目而被错误调用)抛出multivaluedictkeyerror异常。

然后我改变了url .py中的最后一个url模式,以正确的路径('about/',views.about,name="about"),一切正常工作。

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

希望这能帮助一些新手程序员使用django。

其他回答

First check if the request object have the 'is_private' key parameter. Most of the case's this MultiValueDictKeyError occurred for missing key in the dictionary-like request object. Because dictionary is an unordered key, value pair “associative memories” or “associative arrays” In another word. request.GET or request.POST is a dictionary-like object containing all request parameters. This is specific to Django. The method get() returns a value for the given key if key is in the dictionary. If key is not available then returns default value None.

你可以这样处理这个错误:

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

另一件要记住的事情是请求。POST['keyword']指向由指定的html name属性关键字标识的元素。

如果你的表单是:

<form action="/login/" method="POST">
  <input type="text" name="keyword" placeholder="Search query">
  <input type="number" name="results" placeholder="Number of results">
</form>

然后,请求。POST['keyword']和请求。POST['results']将分别包含输入元素关键字和结果的值。

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

try:

is_private = 'is_private' in request.POST

or

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

这取决于你所使用的值。

我得到了'MultiValueDictKeyError'错误,而使用ajax与Django。只是因为在选择元素时没有输入“#”。像这样。

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

然后我把'#'与id和问题解决了。

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

选择最适合你的:

1

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

如果请求中存在is_private key。POST 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