【问题标题】:Make django ajax view return a file让 django ajax 视图返回一个文件
【发布时间】:2018-01-08 14:30:00
【问题描述】:

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

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

`

【问题讨论】:

  • 那么,你在你的 Ajax 中做什么来显示这个文件?
  • 使用 ajax 我只是将用户选择的数据提交到视图,它应该返回一个文件(带有弹出窗口,“打开方式或下载”)。
  • 是的。 Ajax 返回一个文件。那它在做什么呢?
  • Nah ajax 只是提交给视图,它是我的 Python,它返回一个文件。我在问题中添加了我的 ajax。
  • 因为 Ajax 的全部意义 是您将责任从通常的浏览器工作流程中解脱出来。使用普通表单,单击按钮,浏览器将数据发送到服务器并显示响应。但是使用 Ajax,您将责任从浏览器中移开,并同意在您自己的代码中处理它。如果您不希望这样,请不要使用 Ajax。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-08-11
    • 1970-01-01
    • 2012-05-10
    • 2019-12-19
    • 1970-01-01
    • 2017-11-26
    • 2014-02-03
    • 2020-12-10
    • 2019-10-28
    相关资源
    最近更新 更多