2016-03-22 4 views
0

Когда я отправляю форму через объект ajax FormData в мой Django-back-end, мой request.POST кажется словарем, значения которого являются списками, а не строками. То есть, я надеюсь, это:Почему мой объект FormData POSTing в словаре django списков?

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)?

ответ

3

A QueryDict как request.POST может обрабатывать несколько элементов для каждой клавиши. Это тот случай, если это запрос ajax или нет.

Не беспокойтесь об этом, вам не нужно предварительно обрабатывать данные. Если вы создаете форму с помощью request.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'] 
+0

, пожалуйста, откат моих комментариев, если вы не согласны. С уважением. – danihp

+1

@ danihp edit выглядит хорошо, я немного обновил – Alasdair

+0

Вау, ты прав. Форма будет создавать экземпляр с объектом QueryDict, но не с обычным словарем со списками (только словарь с одиночными значениями). Я только что узнал! Благодаря! – Escher