在我的网络应用程序中,我创建了一个基本搜索,允许用户根据几个字段(日期,创建者等)查询记录。我希望用户能够将这些特定的搜索结果导出为PDF / CSV,但我很难理解如何做到这一点。
我已经建立了一个有效的搜索和结果页面。在结果页面上,有两个不同的超链接/按钮(不确定我应该使用哪个),其中显示“导出为PDF”和“导出为CSV”。当用户点击链接/按钮时,它应该从搜索中导出结果。我熟悉ReportLab和关于导出为PDF的Django文档。我的问题是关于我应该如何处理搜索结果,以便我可以在用户决定的情况下导出它们。
解决此问题的最佳方法是什么?
我是否将搜索结果保存为会话变量作为pickle对象(Example Pt.1,Example Pt.2),然后在用户想要导出为PDF / CSV时加载它?
我应该将用户搜索的原始SQL保存到数据库中,然后在用户想要导出为PDF / CSV时查找并重新执行查询吗?
我是否应该将搜索变量简单地传递到结果页面上表单中的隐藏字段,然后单击“导出到PDF”时,重新执行搜索?
是否有一种普遍接受的方式来做这种事情?我经常看到它,并希望实施最佳实践。
答案 0 :(得分:0)
如果您的查询不是非常昂贵且您的数据在用户看到您的页面并单击“导出”按钮之间的时间段内不应更改,则无需将查询和结果保存到单独的模型。您只需重新运行查询并将其提供给您的用户,而不是HTML格式,而是以其他格式提供。
CSV:生成上下文的视图代码保持不变,只需更改输出模板即可。例如,您可以模仿Django Rest Framework's behaviour,使您的网址看起来像:
Q.nfcall
/a/path?with=query
/a/path.csv?with=query
并根据路径选择approrpiate模板。
至于PDF,事情变得复杂一些,请看the Django docs。
答案 1 :(得分:0)
我认为根据您的查询,最好的方法是进行一次查询!它已经过优化,虽然你不应该将搜索结果保存到数据库,但它只是一个不必要的负载。
我认为你应该这样做:
搜索可用的pdf制作软件包:
1.1 The reportlab:这是django docs中建议的默认包,但据我所知会有一些问题 在PDF中输出unicode字符
1.2 WKHTMLTOPDF:我最喜欢的那个!它使用二进制文件来执行pdf制作命令,它易于使用和转换您的HTML 归档为精美的PDF。目前我正在使用它,但你会有一些 生产服务器上执行二进制文件的问题。 1.3 Python PDF Kit:只是另一个pdf工具包。
搜索可用的csv文件:
2.1您可以使用django csv:它易于使用,您在创建csv文件时遇到了问题。
使用GET方法编写一些这样的模板:
def myview(request):
type = request.GET.get('type', 'html')
# do processing
if type == 'html':
# return html
else if type == 'csv':
# return csv
else if type == 'PDF':
# return PDF
当访问网址http://yourserver/myview
时,它将返回作为搜索结果的视图的html部分。
如果您访问类似http://yourserver/myview?type=csv
的网址,则会呈现视图的csv部分。和http://yourserver/myview?type=pdf
为您的pdf视图。