2

尝试通过视图返回文件时遇到问题。

工作案例:用户提交表单,我从这些值中实例化一个 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 ;
        }
        */
    });
});

`

4

1 回答 1

0

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

于 2017-08-02T10:59:09.300 回答