Передача POST-запроса через AJAX, проблема Django

Мое мнение таково:

def creating_profile(request):
    if request.is_ajax and request.method == "POST":
        array = request.POST.get('nums')
        print(request.POST.get('nums'))
    else:
        print('it's not ajax')

my js:

const RegisterForm = document.forms["RegisterForm"];
const csrftoken = document.querySelector('[name=csrfmiddlewaretoken]').value;
let nums = [1, 2, 3]
RegisterForm.addEventListener('submit', () => {
    $.ajax({
        headers: { 'X-CSRFToken': csrftoken },
        url: '/account/creating-profile/',
        type: 'POST',
        data: { nums: nums },
        success: function (data) {
            //
        }
    });

но он возвращает None результат print(request.POST.get('nums')), я буду рад, если кто-нибудь поможет мне с этим вопросом

Я не очень хорошо знаком с Ajax, но всякий раз, когда я пытаюсь передать данные из формы в представление, я использую FormData:

form_data = new FormData(document.getElementById("RegisterForm"))

Это добавляет все поля формы в словарь, где вы можете получить доступ к значениям по имени поля. Вы можете добавить поверх него, используя .append()

Тогда в своем запросе вы можете использовать

fetch("/account/creating-profile/", {
        headers: myHeaders,
        body: form_data,
        method:"POST"})

И получите его в вашем представлении, используя

nums = request.POST["nums"]

Редактирование :

Ваш JS будет выглядеть следующим образом :

const csrftoken = document.querySelector('[name=csrfmiddlewaretoken]').value;
let nums = [1, 2, 3]
myHeaders = new Headers()
myHeaders.append("X-CSRFToken", csrftoken)
form_data = new FormData(document.forms["RegisterForm"]);
form_data.append("nums", nums) // <-- Here you can add anything to the form data using form_data.append("Key", value)

fetch("/account/creating-profile/", {
        headers: myHeaders,
        body: form_data,
        method:"POST"})

При выполнении этого действия POST на вашем сервере будет выполнен дважды, если вы не предотвратите выполнение POST по умолчанию, вы можете предотвратить это, сделав следующее :

$(function(){
    $("#RegisterForm").submit(function(){
        return false
    })
})

или с помощью слушателя событий и preventDefault (см. документацию : https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)

Вы можете использовать метод getlist() для доступа к объекту списка из POST следующим образом

def creating_profile(request):
    if request.is_ajax and request.method == "POST":
        array = request.POST.getlist('nums')
        print(array)# this will return [1, 2, 3]
    else:
        print('it's not ajax')

а по поводу MultiValueDictKeyError он возникает если данные отсутствуют в вашем request.POST['key'] чем вызывает MultiValueDictKeyError решение следующее использовать метод get(), который вернет None, если данный ключ не имеет значения, и не вызовет исключения.

Данные для отправки на сервер. Это может быть объект JSON, строка или массив.

 data: { "nums": nums }

проверьте это doc.

Вернуться на верх