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

时间:2011-11-18 17:59:24

标签: python django

我已经用这个板找到了我的问题的很多答案,但是这个我找不到帖子了。我确信我必须要有一些不好的代码。我是网络开发的新手,所以我正在学习所有这些(HTTP,HTML,Python和Django,我有20年以上的编程经验,所以我得到它)。我正处于培训视频中的一个点,你们很多人都知道我在哪里发布新内容而没有编辑html中的错误但是看起来字符串数据“内容”没有被传递到它将获得的下一个阶段保存到数据库中。到目前为止,我所遇到的所有错误都与培训是用非常旧的版本编写并且我使用的是更新版本有关。然而,我认为这是我的错,所以我需要一些帮助。我认为在我的views.py中我没有正确传递“内容”字符串或者我没有将密钥传递给数据库条目,因为错误似乎是在下一节“保存”视图中第一行抛出这个错误说它无法找到我试图从最后一个视图传递的数据字符串。错误是......

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 +"/")

3 个答案:

答案 0 :(得分:3)

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

“内容”键仅在页面发布后存在于request.POST中。看起来你正在为POST使用单独的视图,所以它应该在那里。然而,你永远不想直接引用字典中的一个你不确定120%的字符。相反,请使用dict.get

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

如果未设置密钥,则会存储None。您还可以指定默认值:

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

答案 1 :(得分:0)

你需要像这样修改代码

    content = request.GET['content'] 

它应该有效。我也使用了教程并遇到了问题。

答案 2 :(得分:0)

您的save_page视图可以像这样重写,这样可以避免错误:

def save_page(request, page_name):

    Page.objects.get_or_create(name=page_name,
                               content = request.POST.get('content', ""))
    return HttpResponseRedirect("/wikicamp/" + page_name +"/")