使 django ajax 查看 return 一个文件
Make django ajax view return a file
我在尝试通过视图 return 文件时遇到问题。
工作案例:
用户提交表单,我根据这些值实例化一个 excel 文件,然后 return 将其提供给用户。提交后,用户会收到一个弹出窗口,邀请他下载文件。没问题。
无效案例:
用户从 jstree 中选择值并使用 ajax 提交它们。我再次实例化一个 excel 文件和 return 它。然而,尽管一切正常(没有服务器错误,成功函数在 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)
它也没有给出任何错误但没有触发任何东西。我不知道我错过了什么,我看到的唯一区别是在第二种情况下,文件不是从同步 post 提交生成的,但我不知道为什么它应该是一个问题。
提前感谢您的任何建议。
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 ;
}
*/
});
});
`
根据@Daniel Roseman 的回答,通过 ajax 提交数据会阻止使用 Django 视图默认 return 文件。最后,我将文件存储在服务器端的一个临时文件夹中,并在文件中显示一个带有 link 的弹出窗口(使用 jQueryUI),并在用户下载后删除该文件。
我在尝试通过视图 return 文件时遇到问题。
工作案例: 用户提交表单,我根据这些值实例化一个 excel 文件,然后 return 将其提供给用户。提交后,用户会收到一个弹出窗口,邀请他下载文件。没问题。
无效案例: 用户从 jstree 中选择值并使用 ajax 提交它们。我再次实例化一个 excel 文件和 return 它。然而,尽管一切正常(没有服务器错误,成功函数在 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)
它也没有给出任何错误但没有触发任何东西。我不知道我错过了什么,我看到的唯一区别是在第二种情况下,文件不是从同步 post 提交生成的,但我不知道为什么它应该是一个问题。
提前感谢您的任何建议。
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 ;
}
*/
});
});
`
根据@Daniel Roseman 的回答,通过 ajax 提交数据会阻止使用 Django 视图默认 return 文件。最后,我将文件存储在服务器端的一个临时文件夹中,并在文件中显示一个带有 link 的弹出窗口(使用 jQueryUI),并在用户下载后删除该文件。