簡體   English   中英

如何從我的視圖中的Formdata對象獲取數據?

[英]How to get data from a Formdata object in my views?

我的AJAX調用發送一個FormData對象,其中包含一個上傳的圖像數據:

$(document).on('submit', '#profileImageForm', function(e){
    e.preventDefault();
    var form_data = new FormData();
    var image = document.getElementById('id_banner_image').files[0].name;
    form_data.append('file', image);

    $.ajax({
        type:'POST',
        url: '/change_banner_image/',
        data : {
            form_data: form_data,
            csrfmiddlewaretoken: $("input[name='csrfmiddlewaretoken']").val(),
        },
        traditional: true,
        cache: false,
        success: function(response){
            console.log('Success');
        },
    });
});

並且在我的視圖中成功接收到該呼叫:

def change_banner_image(request):
    if request.is_ajax():
        data = request.POST.get('form_data')
        profile = get_object_or_404(Profile, user=request.user)
        profile.image = data
        profile.save()
        print(data)

    return HttpResponse()

print(data)打印: [object FormData] 那么如何從這個FormData對象獲取上傳的圖像? 然后它將是profile.image的值(這是一個FileField )。

問題是因為您正在編碼FormData本身,這是不正確的。 它是二進制數據,無法按照您嘗試的方式進行編碼。

相反,您需要反轉邏輯以將CSRF令牌添加到您發送的FormData 您還需要將processDatacontentType設置為false以便在發送請求之前不修改二進制數據,並刪除traditional屬性。 嘗試這個:

$(document).on('submit', '#profileImageForm', function(e){
    e.preventDefault();
    var form_data = new FormData();
    var image = document.getElementById('id_banner_image').files[0].name;
    form_data.append('file', image);
    form_data.append('csrfmiddlewaretoken', $("input[name='csrfmiddlewaretoken']").val());

    $.ajax({
        type:'POST',
        url: '/change_banner_image/',
        data: form_data,
        processData: false,
        contentType: false,
        cache: false,
        success: function(response){
            console.log('Success');
        },
    });
});

你可以試試這個

data = request.data

如果您發送文件數據

files = request.FILES

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM