如何从我的视图中的Formdata对象获取数据?

时间:2017-10-24 07:51:59

标签: javascript jquery python ajax django

我的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)。

2 个答案:

答案 0 :(得分:0)

问题是因为您对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');
        },
    });
});

答案 1 :(得分:0)

你可以试试这个

data = request.data

如果您发送文件数据

files = request.FILES