Заставьте django ajax view вернуть файл
У меня проблемы при попытке вернуть файл через представление.
Рабочий случай: пользователь отправляет форму, я создаю экземпляр файла 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 ответ
Согласно ответу @Daniel Roseman, отправка данных через ajax не позволяет использовать возврат файлов по умолчанию для представлений Django. В конце я сохранил файл во временной папке на стороне сервера и отобразил всплывающее окно (с jQueryUI) со ссылкой на файл и удалил файл после загрузки пользователем.