django MultiValueDictKeyError错误,如何处理

svgewumm  于 2023-06-25  发布在  Go
关注(0)|答案(9)|浏览(367)

我试图将一个对象保存到数据库中,但它抛出了一个MultiValueDictKeyError错误。
问题在于表单中,is_private由复选框表示。如果未选中该复选框,则显然不会传递任何内容。这就是错误被抛弃的地方。
如何正确处理这个异常并捕获它?
台词是

is_private = request.POST['is_private']
gblwokeq

gblwokeq1#

使用MultiValueDict的get方法。这也存在于标准字典中,是一种获取值的方法,同时提供一个默认值,如果它不存在。

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

一般来说

my_var = dict.get(<key>, <default>)
falq053o

falq053o2#

选择最适合你的:

1

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

如果is_private键存在于request.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
htrmnn0y

htrmnn0y3#

你得到这个是因为你试图从字典里得到一个关键字,而它不在那里。你得先测试它是否在里面。
尝试:

is_private = 'is_private' in request.POST

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

取决于你使用的值。

6qftjkof

6qftjkof4#

另一件需要记住的事情是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']将分别包含输入元素keywordresults的值。

hiz5n14c

hiz5n14c5#

为什么不尝试在模型中将is_private定义为default=False

class Foo(models.Models):
    is_private = models.BooleanField(default=False)
qf9go6mv

qf9go6mv6#

首先检查请求对象是否有'is_private'密钥参数。大多数情况下,此MultiValueDictKeyError是由于类似字典的请求对象中缺少键而发生的。因为dictionary是一个无序的键、值对“关联记忆”或“关联数组”
换句话说。GET或request.POST是一个类似字典的对象,包含所有请求参数。这是Django特有的。
方法get()返回给定键的值,如果key在字典中。如果键不可用,则返回默认值None。
您可以通过以下方式处理此错误:

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

jecbmhm37#

对我来说,这个错误发生在我的django项目中,原因如下:
1.我插入了一个新的超链接在我的home.html目前在我的项目的templates文件夹如下:

<input type="button" value="About" onclick="location.href='{% url 'about' %}'">

1.在www.example.com中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")

1.在www.example.com中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模式中,我错误地调用了views.count,而我需要调用views.about。www.example.com的count函数中的这行fulltext = request.GET['fulltext'](由于urlpatterns中的错误输入而被错误地调用)views.py抛出了multivaluedictkeyerror异常。
然后我把www.example.com中的最后一个URL模式更改urls.py为正确的。path('about/',views.about,name="about"),一切都很好。
显然,一般来说,django的新手程序员可能会犯我犯的错误,错误地调用另一个url的视图函数,这可能是期望不同的参数集或者在render调用中传递不同的对象集,而不是预期的行为。
希望这对一些新手程序员django有帮助。

cbjzeqam

cbjzeqam8#

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

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

然后我把'#'和id放在一起,问题就解决了。

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

fcwjkofz9#

如果请求中不存在该名称,则将插入NULL值

name = request.data.get('name')

相关问题