Kwang Kwang - 1 month ago 24
Python Question

MultiValueDictKeyError / request.POST

I think I hav a problem at request.POST['title']


MultiValueDictKeyError at /blog/add/post/
"'title'"
Request Method: GET
Request URL: http://119.81.247.69:8000/blog/add/post/
Django Version: 1.8.2
Exception Type: MultiValueDictKeyError
Exception Value:

"'title'"
Exception Location: /usr/local/lib/python2.7/dist- packages/django/utils/datastructures.py in getitem, line 322
Python Executable: /usr/bin/python
Python Version: 2.7.3


views.py

def add_post(request):
entry_title = request.POST["title"]
return HttpResponse('Hello %s' % entry_title)


write.html

<form method="POST" action="/blog/add/post/">
<p>
<label for "title">Title</label>
<input type="text" id="title" name="title" value="" />
</p>
<p>
<label for 'category'>Category</label>
<select id="category" name="category"></select>
</p>
<p>
<label for 'tags'>Tags</label>
<input type="text" id="tags" value="" />
</p>
<p>
<textarea id="content" name="content"></textarea>
</p>
<p>
<input type="submit" value="Write" />
</p>



Answer Source

Change:

def add_post(request):
    entry_title = request.POST["title"]
    return HttpResponse('Hello %s' % entry_title)

to:

def add_post(request):
    entry_title = request.POST.get("title", "Guest (or whatever)")
    return HttpResponse('Hello %s' % entry_title)

and it won't throw a KeyError, but you should look at using Django's forms rather than pulling values directly from the POST data.

Alternatively, you can keep your existing code and simply check for the exception:

def add_post(request):
    try:
        entry_title = request.POST["title"]
    except KeyError:
        entry_title = "Guest"
    return HttpResponse('Hello %s' % entry_title)

but this is what .get() does internally already.