2016-12-05 60 views
0

我想通過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]一個真正的名單?

回答

1

我終於解決了這個問題:在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']

3

如果您想發送一個數組,你需要附加元素一點點不同的方式:

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']'。 –

1

您可以在不使用FORMDATA。

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

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

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

1

嘗試發送陣列像這樣:

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

不工作,要麼。 –

1

您發送應該是一個對象

例如

這裏
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 –

1

好吧,你需要一些東西把帳戶首先你缺少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請求

我希望它幫