Django POST сохраняет все в ключе вместо пары ключ-значение - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь опубликовать несколько данных формы в одном go (Да, им нужно go в качестве одного сообщения. Нет, это нельзя изменить. Даже не предлагать несколько отправок.) И я может построить правильный тип объекта.

convert_to_object - это пользовательская функция, которая преобразует сериализованный массив в объект с правильными парами ключ-значение

save_button.click(function(){
      //Collect information
      console.log("Collecting form data");
      var data = {};
      data.form1= convert_to_object($("[data-formtype='form1']").serializeArray());
      data.form2= convert_to_object($("[data-formtype='form2']").serializeArray());
      data.form3= convert_to_object($("[data-formtype='form3']").serializeArray());

      var items= []; 
      forms_list.forEach(form_in_list=> {
        items.push(convert_to_object(form_in_list.serializeArray()));
      });

      data.list_of_items = items;


      //Send our data object to our endpoint
      $.post("add", data)
      .done(function(data, status){
          //Success handling
      })
      .fail(function(data, status){
          //Failure handling
      })

    });

Это создает правильный JavaScript объект, который имеет все значения в правильной форме, и я могу преобразовать это в JSON строку.

Проблема в том, что когда я отправляю эту JSON строку в Django, я не получаю пары ключ-значение в запросе. POST вместо этого я получаю всю строку json в качестве ключа и значение в виде пустой строки. Поэтому вместо

<QueryDict: {
    "form1":{"field1":"","field2":"","field3":""},
    "form2":{"field1":"","field2":"","field3":"","field4":""},
    "form3":{"field1":"","field2":"","field3":"","field4":""},
    "list_of_items":[ {"item1":"", "item2":""}] 
}>

я получаю

<QueryDict: 
'{"form1[field1]":[""],"form1[field2]":[""],"form1[field3]":[""],"form2[field1]":[""],"form2[field2]":[""],"form2[field3]":[""],"form2[field4]":[""]},"form2[field1]":["]","form2[field2]":[""],"form2[field3]":[""],"form2[field4]":[""]},"list_of_items[0][item1]":"","list_of_items[0][item2]":""}' : ''
}>

Как вы видите, во втором весь набор превращается в ключ, а не в серию пар ключ-значение.

Как убедиться, что мой объект правильно сопоставлен с набором запросов POST?

РЕДАКТИРОВАТЬ

JSON строка, которая отправляется (с форматированием для удобства чтения):

{
"form1":{"field1":"","field2":"","field3":""},
"form2":{"field1":"","field2":"","field3":"","field4":""},
"form3":{"field1":"","field2":"","field3":"","field4":""},
"list_of_items":[{"item1":"", "item2":""]
}

РЕДАКТИРОВАТЬ 2

Снимок экрана XHR (Firefox). Пожалуйста, игнорируйте 501 ответ, который является намеренным ответом (пока) Screenshot of XHR (Firefox)

Ответы [ 2 ]

0 голосов
/ 25 февраля 2020

Благодаря @Jordan Kowal я смог решить эту проблему. Проблема заключалась в том, что данные отправлялись в виде строки, а не объекта. Убедившись, что переменная остается объектом, я смог правильно загрузить данные.

Хотя я также обнаружил, что вы можете передать всю вещь в виде JSON строки, а затем загрузить ее из request.body, который дает вам подсказку, которую вы можете легко обработать.

0 голосов
/ 25 февраля 2020

Проверьте этот пост. У кого-то такая же проблема, как и у вас, и ему удалось ее исправить: Странное поведение Django's Querydict: объединяет словарь POST в один ключ

Дайте мне знать, если оно работает

...