使django ajax视图返回一个文件

时间:2017-08-01 16:03:21

标签: ajax django django-file-upload django-excel

我在尝试通过视图返回文件时遇到了麻烦。

工作案例: 用户提交表单,我从这些值实例化excel文件并将其返回给用户。提交后,用户弹出一个邀请他下载文件的弹出窗口。没问题。

不工作案例: 用户从jstree中选择值并使用ajax提交它们。我再次实例化一个excel文件并将其返回。但是,虽然一切都会被罚款(没有服务器错误,在ajax中触发成功功能),但没有任何反应。该文件以这种方式创建:

    response = HttpResponse(content_type='application/ms-excel')
    response['Content-Disposition'] = 'attachment; filename="export.xls"'
    response = comparaison(response, wb, ws_same, ws_diff, tree_left, tree_right)
    wb.save(response)
    return response

在第一种情况下没有问题,但在第二种情况下没有。

我还尝试通过将文件短时间保存在服务器上并以这种方式将用户重定向到其位置来找到解决方法。

wb.save('export.xls')
return redirect(path_to_export_xls)

它也没有错误但没有触发任何错误。我不知道我错过了什么,我看到的唯一区别是,在第二种情况下,文件不是从同步的帖子提交生成的,但我不知道为什么它应该是一个问题。

提前感谢任何建议。

PS:这是ajax代码。

`$('#button_compare').on('click', function () {
    var raw_left = jstreeDiv.jstree(true).get_checked(true),
        raw_right = jstreeCreate.jstree(true).get_checked(true),
        tree_left = [],
        tree_right = [];
    for(var i = 0; i<raw_left.length ; i++){
        tree_left.push(raw_left[i].li_attr['data-id']);
    }
    for(var i = 0; i<raw_right.length; i++){
        tree_right.push(raw_right[i].li_attr['data-id']);
    }
    $.ajax({
        url: '../Comparer/',
        type: 'POST',
        beforeSend: function (xhr, settings) {
            if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                xhr.setRequestHeader("X-CSRFToken", csrftoken);
            }
        },
        data: {
            'tree_left': JSON.stringify(tree_left),
            'tree_right': JSON.stringify(tree_right)
        },
        /*
        success:function(response){
            alert('OK');
        },
        error:function (xhr, status, error) {
            return false ;
        }
        */
    });
});

`

1 个答案:

答案 0 :(得分:0)

根据@Daniel Roseman的回答,通过ajax提交数据阻止使用Django视图默认返回文件。最后,我将文件存储在服务器端的临时文件夹中,并显示一个弹出窗口(带有jQueryUI),其中包含指向该文件的链接,并在用户下载后删除该文件。