为什么我的 FormData 对象 POST 到列表的 django 字典中?
Why is my FormData object POSTing into a django dictionary of lists?
当我通过 ajax FormData
对象向我的 Django 后端提交表单时,我的 request.POST
似乎是一个字典,其值是列表,而不是字符串。即,我希望这样:
In [1]: request.POST
Out[1]: {'somekey': 'somevalue', ...}
相反,我得到这个:
In [2]: request.POST
Out[2]: {'somekey': ['somevalue'], ...}
这是我提交的方式:
var form = document.forms["my-form"]
//note, all of #my-form's inputs are type="hidden" if it makes a difference...
var fd = new FormData(form);
var xhr = new XMLHttpRequest();
xhr.open('POST', '/my-view/', true);
xhr.onload = function(){
if(xhr.status == 200){
//doStuff();...
}
}
xhr.setRequestHeader("X-CSRFToken", csrftoken);
xhr.send(fd);
显然,我可以遍历我的 request.POST 字典并将这些列表转换为字符串,然后再尝试用数据实例化一个 django Form
对象(用于验证目的),但我有一种感觉出事了。为什么我的 FormData
对象变成了列表字典(显然不能按原样使用它来创建有效的 django Form
)?
像request.POST
这样的QueryDict可以为每个键处理多个项目。不管是不是ajax请求都是这样。
不用担心,您不必对数据进行预处理。如果您使用 request.POST
实例化您的表单,表单会很好地处理它。
如果您手动处理 post 数据,请注意有一个 getlist
方法可用于检索列表。以文档中的示例为基础:
>>> from django.http import QueryDict
>>> q = QueryDict('a=1&a=2&c=3')
>>> q
<QueryDict: {'a': ['1', '2'], 'c': ['3']}>
>>> q['a'] # gets the last item
u'2'
>>> q.getlist('a') # gets the list
[u'1', u'2']
>>> q['c'] # gets the last (and only) item
u'3'
>>> q.getlist('c') # gets the list (which contains a single item)
[u'3']
当我通过 ajax FormData
对象向我的 Django 后端提交表单时,我的 request.POST
似乎是一个字典,其值是列表,而不是字符串。即,我希望这样:
In [1]: request.POST
Out[1]: {'somekey': 'somevalue', ...}
相反,我得到这个:
In [2]: request.POST
Out[2]: {'somekey': ['somevalue'], ...}
这是我提交的方式:
var form = document.forms["my-form"]
//note, all of #my-form's inputs are type="hidden" if it makes a difference...
var fd = new FormData(form);
var xhr = new XMLHttpRequest();
xhr.open('POST', '/my-view/', true);
xhr.onload = function(){
if(xhr.status == 200){
//doStuff();...
}
}
xhr.setRequestHeader("X-CSRFToken", csrftoken);
xhr.send(fd);
显然,我可以遍历我的 request.POST 字典并将这些列表转换为字符串,然后再尝试用数据实例化一个 django Form
对象(用于验证目的),但我有一种感觉出事了。为什么我的 FormData
对象变成了列表字典(显然不能按原样使用它来创建有效的 django Form
)?
像request.POST
这样的QueryDict可以为每个键处理多个项目。不管是不是ajax请求都是这样。
不用担心,您不必对数据进行预处理。如果您使用 request.POST
实例化您的表单,表单会很好地处理它。
如果您手动处理 post 数据,请注意有一个 getlist
方法可用于检索列表。以文档中的示例为基础:
>>> from django.http import QueryDict
>>> q = QueryDict('a=1&a=2&c=3')
>>> q
<QueryDict: {'a': ['1', '2'], 'c': ['3']}>
>>> q['a'] # gets the last item
u'2'
>>> q.getlist('a') # gets the list
[u'1', u'2']
>>> q['c'] # gets the last (and only) item
u'3'
>>> q.getlist('c') # gets the list (which contains a single item)
[u'3']