通过ajax发送数组到Django

通过ajax发送数组到Django

问题描述:

我想通过ajax发送一个JavaScript数组到Django,如下所示。通过ajax发送数组到Django

main.html

<a href=#>Click</a> 

<script> 
$(document).on('click', 'a', function() { 

    var arr = [1, 2, 3, 4]; 
    var formData = new FormData(); 
    formData.append('arr', arr); 

    $.ajax({ 
    url: '...', 
    type: 'POST', 
    data: formData, 
    processData: false, 
    contentType: false 
    }); 

}); 
</script> 

和服务器端:

views.py

@csrf_exempt 
def main(request): 
    arr = request.POST.get('arr') 
    print(type(arr)) 
    print(arr) 
    return render(request, 'main/main.html') 

结果是一个字符串:'1,2,3,4'

如果我检索与数据:

arr = request.POST.getlist('arr') 

结果是包含字符串列表:['1,2,3,4']

我怎样才能像[1, 2, 3, 4]一个真正的名单?

我终于解决了这个问题:在JavaScript中的数据没有[],但在Python添加[]

JS:

var arr = [1, 2, 3, 4]; 

$.ajax({ 
    url: '...', 
    type: 'POST', 
    data: {'arr': arr}, 
}); 

的Python:

arr = request.POST.get('arr[]') 

,其结果是有4个元素的列表:['1', '2', '3', '4']

如果您想发送一个数组,你需要附加元素一点点不同的方式:

formData.append('arr[]', arr); 

请查看更多细节和例子文档: https://developer.mozilla.org/en-US/docs/Web/API/FormData/append

+0

的'[]'的'ARR []'只是PHP的命名约定。 Django似乎并不尊重这一点。 –

+0

那么它不仅仅是一个PHP的命名约定,它是一种在http协议中将数组作为get参数发送给URL的方法。 – ZedXter

+0

但是'arr = request.POST.get('arr []')'的结果仍然是一个字符串:''1,2,3,4''和'arr = request.POST.getlist('arr []')'仍然是一个包含一个字符串的列表:'['1,2,3,4']'。 –

您可以在不使用FORMDATA。

var arr = [1, 2, 3, 4] 

$.ajax({ 
    url: '...', 
    type: 'POST', 
    data: arr, 
    processData: false, 
    contentType: false 
}) 
+0

但'request.POST.get('arr')'什么也得不到? –

尝试发送阵列像这样:

var arr = [1, 2, 3, 4] 

$.ajax({ 
    url: '...', 
    type: 'POST', 
    data: {'arr', arr }, 
    processData: false, 
    contentType: false 
}) 
+0

我想它应该是一个分号作为'{'arr':arr}'。但是Django仍然无法检索数组。结果是“无”。 –

+0

发送你的数据为json数据,删除'processData:false', 'contentType:false'并把'dataType:'json'' –

+0

不工作,要么。 –

您发送应该是一个对象

例如

这里
data = { 
a : [1,2,3,4] 
} 

输入代码

数据

so

$.ajax({ 
    url: '...', 
    type: 'POST', 
    data: data, 
    processData: false, 
    contentType: false 
}) 
+0

我想它应该是'arr:[1,2,3,4]'。但是Django仍然无法检索数组。结果是None(无)。 –

+0

你得到的回应是什么? –

+0

也内容类型应该是application/json –

好吧,你需要一些东西把帐户首先你缺少csrf_token 默认情况下会丢弃任何xhr请求

现在普通的Django视图期望的形式,而不是到JSON所以让你期望的结果 你的代码应该看起来像:

$.ajax({ 
    type: "POST", 
    url: 'http://localhost:8000/test/', 
    data: "{ 'a': [1,2,3,4] }", 
    contentType: "application/x-www-form-urlencoded/json", 
    dataType: "json", 
    headers: {"X-CSRFToken":'{{ csrf_token }}'}, 
    success: function (result) { 
     console.log(result.d); 
    }, 
    error: function (result) { 
     console.log(result); 
    } 
}); 

x-www-from-urlencoded - will threat data as form 

与代码,你的数据将在request.POST 它,你可以找到将设置

content-type : 'application/json' 

,你会看到在请求

的设置CSRF头,如果你使用Django的模板代码 你CA使用的体数据n使用这种方式 如果你不将分析Cookie,并设置在Ajax请求

我希望它帮