Отправка массива текстов в Django через POST не получается получить как массив, получается строка.

Вопрос или проблема

Я отправляю эти данные в 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, обеспечивая корректную обработку на стороне сервера.

Оцените материал
Добавить комментарий

Капча загружается...