簡體   English   中英

django MultiValueDictKeyError 錯誤,我該如何處理

[英]django MultiValueDictKeyError error, how do I deal with it

我正在嘗試將 object 保存到我的數據庫中,但它引發了MultiValueDictKeyError錯誤。

問題在於表單, is_private由復選框表示。 如果未選中該復選框,則顯然沒有通過任何內容。 這就是錯誤被丟棄的地方。

如何正確處理此異常並捕獲它?

這條線是

is_private = request.POST['is_private']

使用 MultiValueDict 的get方法。 這也存在於標准字典中,並且是一種獲取值的方法,同時在不存在時提供默認值。

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

一般來說,

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

選擇最適合您的:

1

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

如果在 request.POST 中存在is_private密鑰,則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

你得到它是因為你試圖從字典中獲取一個不存在的鍵。 你需要先測試它是否在那里。

嘗試:

is_private = 'is_private' in request.POST

或者

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

取決於您使用的值。

要記住的另一件事是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的值。

您為什么不嘗試在模型中將is_private定義為default=False

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

對我來說,這個錯誤發生在我的 django 項目中,原因如下:

  1. 我在我的主頁中插入了一個新的超鏈接。html 出現在我的項目的模板文件夾中,如下所示:

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

  2. 在 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. 在 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。 views.py 的這一行fulltext = request.GET['fulltext'] in count function(由於 urlpatterns 中的錯誤條目而被錯誤地調用)引發了 multivaluedictkeyerror 異常。

然后我將 urls.py 中的最后一個 url 模式更改為正確的模式,即path('about/',views.about,name="about") ,一切正常。

顯然,一般來說,django 中的新手程序員可能會犯我犯的錯誤,即錯誤地為 url 調用另一個視圖 function,而不是傳遞不同的渲染調用或傳遞不同的對象集的預期行為。

希望這對 django 的一些新手程序員有所幫助。

首先檢查請求 object 是否有 'is_private' 密鑰參數。 大多數情況下,這種 MultiValueDictKeyError 發生在類字典請求 object 中缺少鍵。 因為字典是無序鍵,值對“關聯記憶”或“關聯數組”

換句話說。 request.GET 或 request.POST 是一個類似於字典的 object 包含所有請求參數。 這特定於 Django。

如果鍵在字典中,則 get() 方法返回給定鍵的值。 如果 key 不可用,則返回默認值 None。

您可以通過放置以下內容來處理此錯誤:

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

將 ajax 與 Django 一起使用時出現“MultiValueDictKeyError”錯誤。 只是因為在選擇元素時沒有輸入“#”。 像這樣。

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

然后我把'#'和id放在一起,問題就解決了。

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

如果請求中不存在名稱,這將插入 NULL 值

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM