Заставьте 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) со ссылкой на файл и удалил файл после загрузки пользователем.

Другие вопросы по тегам