Как отобразить страницу и начать загрузку файла с нее в django? - PullRequest
0 голосов
/ 24 октября 2019

У меня есть метод в моем views.py, который я создал с ответом http

 # # content-type of response
    response = HttpResponse(content_type='application/ms-excel')

    # #decide file name
    response['Content-Disposition'] = 'attachment; filename="ThePythonDjango.xls"'
#adding new sheets and data
                new_wb = xlwt.Workbook(encoding='utf-8')
new_wb.save(response)

Это работает нормально, если у меня есть только ответ в моем возвращении, но я также хочу вернуть рендер

return  render(request, 'uploadpage/upload.html', {"excel_data": seller_info, "message":message, "errormessage":errormessage})

Мне было интересно, есть ли способ сделать это

1 Ответ

0 голосов
/ 24 октября 2019

Это можно сделать, заставив представление по-разному вести себя при наличии какого-либо параметра запроса, например, параметра download. Фактически, это было бы эквивалентно наличию двух отдельных представлений:

  1. Первое представление должно возвращать обработанный HTML-ответ, который автоматически запускает загрузку файла. Например, с помощью iframe просто вставьте этот код в шаблон:

    <iframe width="1" height="1" frameborder="0" src="?download"></iframe>
    

    Вы можете увидеть другие способы запуска автоматической загрузки здесь: Как запустить автоматическую загрузку файла в Internet Explorer?

  2. Второе представление должно содержать ваш код генерации XLS и возвращать HttpResponse с содержимым XLS.

Объединение этого в одинвид может выглядеть так:

def xls_download_view(request):
    if 'download' in request.GET:
        response = HttpResponse(content_type='application/ms-excel')
        response['Content-Disposition'] = 'attachment; filename="ThePythonDjango.xls"'
        new_wb = xlwt.Workbook(encoding='utf-8')
        ...
        new_wb.save(response)
        return response
    else:
        ...
        return render(...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...