Opened 4 years ago

Closed 4 years ago

#17191 closed Bug (invalid)

QueryDict appears incorrect on POST.

Reported by: otto@… Owned by: nobody
Component: Uncategorized Version: 1.3
Severity: Normal Keywords: QueryDict, POST, MultiValueDictKeyError
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

The following is test code stripped to bare essentials. When run with
">python manage.py runserver".
The values entered in the form at the T1 and T2 fields are "t1-value"
and "t2-value" respectively.

The following error is produced:

MultiValueDictKeyError at /test_view/
"Key 't1' not found in <QueryDict: {u'Bname': [u'Bval\\r\\nt1=t1-value\\r\\nt2=t2-value\\r\\n']}>"

Code that produces this is:

##### BEGIN CODE #####
#views_test.py#
from django.http import HttpResponse
from django import template     
from django.views.decorators.csrf import csrf_exempt

data = \
"""
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head><title>Test</title></head>
  <body>
    <form enctype="text/plain" method="POST" action="/test_view/">
        <button value="Bval" name="Bname">TEST</button><br><br>
        T1 &nbsp;<input name="t1" value=""/><br>
        T2 &nbsp;<input name="t2" value=""/><br><br>
    </form>
  </body>
</html>
"""

@csrf_exempt 
def test(request):    
    return HttpResponse(data)

@csrf_exempt 
def test_view(request):
    t1 = request.POST['t1']
    t2 = request.POST['t2']
    return HttpResponse("Returns %s and %s OK with %s " % (t1,t2,"POST"))
##### END CODE #####

Moving the button and input fields around shows that the
"QueryDict" key is always the
first field name in the form "Bname" above. Moving the button to follow the entry fields gets following error:

MultiValueDictKeyError at /test_view/
"Key 't2' not found in <QueryDict: {u't1': [u't1-value\\r\\nt2=t2-value\\r\\nBname=Bval\\r\\n']}>"

Changing POST to GET throughout makes form work.

Change History (1)

comment:1 Changed 4 years ago by aaugustin

  • Needs documentation unset
  • Needs tests unset
  • Patch needs improvement unset
  • Resolution set to invalid
  • Status changed from new to closed

The text/plain encoding isn't supported by Django.

Based on the HTML spec, I don't think it's valid. Use application/x-www-form-urlencoded (the default) instead.

Note: See TracTickets for help on using tickets.
Back to Top