为什么我的 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']