我有一个django网站-做的东西。当按下打印按钮时,我需要它运行def(),然后返回主页
return view_xlsx(request, xlspath)
return render(request, 'webpage/HomePage.html', {'last_update': lastupdted})
我怎样才能既运行view_xlsx(在浏览器中下载),然后返回主页?
我试过了
return view_xlsx(request, xlspath), render(request, 'webpage/HomePage.html', {'last_update': lastupdted})
和/或
try:
return view_xlsx(request, xlspath)
finally:
return render(request, 'website/HomePage.html', {'last_update': lastupdted})
他们两个都独立工作,但似乎不会一起工作。有什么想法?
编辑
def view_xlsx(request, xlspath):
filename = xlspath.replace('\\', '/')
name = filename.split('/')[-1]
if os.path.exists(filename):
response = FileResponse(open(filename, 'rb'), content_type='application/xlsx')
response['Content-Disposition'] = f'inline; filename={name}' # user will be prompted display the PDF in the browser
# response['Content-Disposition'] = f'filename={name}' # user will be prompted display the PDF in the browser
return response
else:
return HttpResponseNotFound('Cannot find the XLS')
3条答案
按热度按时间dgenwo3n1#
你不能。这是HTTP协议的限制。
一个典型的解决方法是重定向到一个html页面,该页面包含一个到生成的xls的链接(或者如果要求不高的话,它将“动态”生成xls)。您的视图将启动另一个进程(或Celery任务等)来生成xls,并将创建一个对象来表示结果,初始值/字段表示“pending”或“ETA 4 mins”。
您可以将“您的下载”构建到主页中(如果是这样的话),以便在(异步)生成完成后进行检索。
另一种解决方法是使用JS和 AJAX 定期询问xls是否准备就绪,并在HTML页面中显示微调器或估计的等待时间。如果你这样做,你必须考虑如果用户变得不耐烦并离开页面会发生什么。
bn31dyow2#
您可以通过使用JavaScript来处理下载,然后将用户重定向到主页来实现这一点。首先,修改你的
view_xlsx
函数返回一个包含文件URL的JSON响应,而不是直接返回文件:接下来,在
urls.py
中为view_xlsx
函数创建一个新端点:现在,在模板中添加一个JavaScript函数来处理下载和重定向:
最后,修改打印按钮以在单击时调用
downloadAndRedirect
函数:这样,当用户点击打印按钮时,JavaScript函数将下载文件,然后将用户重定向到主页。
7ajki6be3#
我通过定义一个新的组合函数并调用它来做到这一点