Skip to main content
 首页 » 编程设计

python之MultiValueDictKeyError之尝试从视频教程 "wikicamp"中学习 Django

2024年08月30日29insus

我已经使用这个板找到了我的问题的许多答案,但我找不到这个问题的帖子。我确定我必须有一些错误的代码。我是 Web 开发的新手,所以我正在学习所有这些(同时学习 HTTP、HTML、Python 和 Django,我确实有 20 多年的编程经验,所以我明白了)。我在培训视频中的某个时刻,你们中的许多人都知道我在哪里发布新内容而不会从编辑 html 中出错,但似乎字符串数据“内容”没有被传递到下一阶段,它会得到保存到数据库中。到目前为止,我遇到的所有错误都与以下事实有关:培训是用非常旧的版本编写的,而我使用的是较新的版本。但是我认为这是我的错,所以我需要一些帮助。我认为在我的 views.py 中我没有正确传递“内容”字符串或者我没有将 key 传递给数据库条目,因为错误似乎是在下一节中“保存” View 第一行抛出这个错误说明它找不到我试图从上一个 View 传递的数据字符串。错误是...

Request Method:     POST 
Request URL:    http://127.0.0.1:7000/wikicamp/tony/save/ 
Django Version:     1.3.1 
Exception Type:     MultiValueDictKeyError 
Exception Value:     
 
"Key 'content' not found in <QueryDict: {u'csrfmiddlewaretoken': [u'a9be0ebf915fc40b13b016e791a153be']}>" 

追溯

Environment: 
 
 
Request Method: POST 
Request URL: http://127.0.0.1:7000/wikicamp/tony/save/ 
 
Django Version: 1.3.1 
Python Version: 2.7.2 
Installed Applications: 
['django.contrib.auth', 
 'django.contrib.contenttypes', 
 'django.contrib.sessions', 
 'django.contrib.sites', 
 'django.contrib.messages', 
 'django.contrib.staticfiles', 
 'wikicamp.wiki', 
 'django.contrib.admin'] 
Installed Middleware: 
('django.middleware.common.CommonMiddleware', 
 'django.contrib.sessions.middleware.SessionMiddleware', 
 'django.middleware.csrf.CsrfViewMiddleware', 
 'django.contrib.auth.middleware.AuthenticationMiddleware', 
 'django.contrib.messages.middleware.MessageMiddleware') 
 
 
Trace back: 
 
    File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response 
      111.                         response = callback(request, *callback_args, **callback_kwargs) 
    File "D:\web dev\training\Django\secondproj\wikicamp\..\wikicamp\wiki\views.py" in save_page 
      30.   content = request.POST["content"] # error thrown for this line of code 
    File "C:\Python27\lib\site-packages\django\utils\datastructures.py" in __getitem__ 
      256.             raise MultiValueDictKeyError("Key %r not found in %r" % (key, self)) 
 
    Exception Type: MultiValueDictKeyError at /wikicamp/tony/save/ 
    Exception Value: "Key 'content' not found in <QueryDict: {u'csrfmiddlewaretoken': [u'a9be0ebf915fc40b13b016e791a153be']}>" 

查看代码

def view_page(request, page_name): 
    try: 
        page=Page.objects.get(pk=page_name) 
    except Page.DoesNotExist: 
        return render_to_response("create.html", {"page_name":page_name}) 
    content = page.content 
    return render_to_response("view.html", {"page_name":page_name, "content":content}) 
 
def edit_page(request, page_name): 
    try: 
        page = Page.objects.get(pk=page_name) 
        content = page.content 
    except Page.DoesNotExist: 
        content = "" 
    return render_to_response("edit.html",{"page_name":page_name, "content":content},context_instance=RequestContext(request)) 
 
def save_page(request, page_name): 
 
    content = request.POST["content"] # error thrown for this line of code 
    try: 
        page = Page.objects.get(pk=page_name) 
        page.content = content 
    except Page.DoesNotExist: 
        page = Page(name=page_name, content = content, date = date) 
        page = Page(name=page_name, content = content) 
    page.save() 
    return HttpResponseRedirect("/wikicamp/" + page_name +"/") 

请您参考如下方法:

完整跟踪更有意义,尽管我应该在使用您的示例代码之前看到它。

“content”键仅在页面发布后存在于 request.POST 中。不过,看起来您正在为 POST 使用单独的 View ,所以它应该在那里。然而,您永远不想直接引用字典中您不确定 120% 是否存在的键。相反,使用 dict.get:

content = request.POST.get('content') 

如果未设置 key ,将存储 None。您还可以指定一个默认值:

content = request.POST.get('content', 'this is the default')