Вопрос или проблема
Я отправляю эти данные в Django, эти тексты из нескольких CKEditor’ов
chk_vals = ["Некоторый текст","Другой текст"];
const data = new URLSearchParams();
data.append("csrfmiddlewaretoken", "{{csrf_token}}");
data.append("tmplData", JSON.stringify(chk_vals));
fetch(uri, {
method: 'post',
body: data,
})
.then(response => response.json())
.then(data => {
Это из сети Chrome:
tmplData: [“Некоторый текст”,”Другой текст”]
Теперь Django:
data = request.POST
templateArr = data.getlist('tmplData')
templateList = list(templateArr)
И длина templateList равна 1, он получает это как одну строку, и я не могу разбить ее с помощью ‘,’ потому что эти тексты также могут содержать ‘,’.
Я также пробовал
templateArr = data.getlist(‘tmplData[]’)
и отправляя без JSON.stringify, но ничего не работает
data = request.POST
templateArr = data.getlist('tmplData[]')
templateList = list(templateArr)
и эта переменная templateArr пустая
.
Ответ или решение
Когда вы отправляете массив строк через POST-запрос в Django, и получаете его в виде строки, это чаще всего связано с тем, как данные формируются и декодируются на стороне клиента и сервера. Ваша проблема заключается в том, что tmplData
, который вы отправляете, становится строкой при получении на стороне Django. Давайте разберем это более подробно, чтобы помочь вам правильно передать массив данных.
Проблема с кодировкой данных
Код, который вы привели, создает объект URLSearchParams
, в который вы добавляете tmplData
как строку с помощью JSON.stringify()
. Это верно, поскольку JavaScript отправляет данные в виде строки, а Django ожидает массив. При этом, когда Django получает строку, она интерпретирует её как единственный элемент вместо массива.
Решение
Для того чтобы корректно отправить массив данных в Django, необходимо изменить способ, которым вы добавляете tmplData
в URLSearchParams
. Вместо сериализации в JSON, вы можете использовать метод append
для добавления каждого элемента массива отдельно:
const chk_vals = ["Some text", "Other text"];
const data = new URLSearchParams();
data.append("csrfmiddlewaretoken", "{{csrf_token}}");
// Добавляем каждый элемент массива отдельно
chk_vals.forEach(value => {
data.append("tmplData[]", value); // Используем "tmplData[]"
});
fetch(uri, {
method: 'post',
body: data,
})
.then(response => response.json())
.then(data => {
// Обработка ответа
});
Получение данных в Django
На стороне Django вы сможете получить массив так:
data = request.POST
templateArr = data.getlist('tmplData[]') # Указываем 'tmplData[]'
В этом случае templateArr
будет массивом строк, как ожидалось. Вы можете легко преобразовать его в нужный вам формат:
templateList = list(templateArr)
Теперь templateList
будет содержать все строки, переданные из вашего массива chk_vals
.
Заключение
Для успешной передачи массива строк через POST-запрос в Django необходимо убедиться, что каждый элемент массива отправляется отдельно. Использование data.append("tmplData[]", value)
гарантирует, что Django сможет правильно интерпретировать их как список. Это избавляет вас от необходимости парсить строки и потенциальных ошибок, связанных с наличием запятых в текстах.
Следуя предложенным рекомендациям, вы сможете без проблем передавать массив данных в Django, обеспечивая корректную обработку на стороне сервера.