通过 AJAX 传递POST请求,Django问题

ccrfmcuu  于 2023-05-23  发布在  Go
关注(0)|答案(2)|浏览(157)

我的看法是:

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

我的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) {
            //
        }
    });

但是它返回Noneprint(request.POST.get('nums'))的结果,如果有人能帮助我解决这个问题,我会很高兴
更新:

jei2mxaa

jei2mxaa1#

我不是很熟悉 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

brgchamk

brgchamk2#

您可以使用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.

相关问题