Django - 将搜索结果导出为PDF / CSV

时间:2016-01-10 17:26:25

标签: python django csv pdf

在我的网络应用程序中,我创建了一个基本搜索,允许用户根据几个字段(日期,创建者等)查询记录。我希望用户能够将这些特定的搜索结果导出为PDF / CSV,但我很难理解如何做到这一点。

我已经建立了一个有效的搜索和结果页面。在结果页面上,有两个不同的超链接/按钮(不确定我应该使用哪个),其中显示“导出为PDF”和“导出为CSV”。当用户点击链接/按钮时,它应该从搜索中导出结果。我熟悉ReportLab和关于导出为PDF的Django文档。我的问题是关于我应该如何处理搜索结果,以便我可以在用户决定的情况下导出它们。

解决此问题的最佳方法是什么?

  • 我是否将搜索结果保存为会话变量作为pickle对象(Example Pt.1Example Pt.2),然后在用户想要导出为PDF / CSV时加载它?

  • 我应该将用户搜索的原始SQL保存到数据库中,然后在用户想要导出为PDF / CSV时查找并重新执行查询吗?

  • 我是否应该将搜索变量简单地传递到结果页面上表单中的隐藏字段,然后单击“导出到PDF”时,重新执行搜索?

是否有一种普遍接受的方式来做这种事情?我经常看到它,并希望实施最佳实践。

2 个答案:

答案 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)

我认为根据您的查询,最好的方法是进行一次查询!它已经过优化,虽然你不应该将搜索结果保存到数据库,但它只是一个不必要的负载。

我认为你应该这样做:

  1. 搜索可用的pdf制作软件包:

    1.1 The reportlab:这是django docs中建议的默认包,但据我所知会有一些问题 在PDF中输出unicode字符

    1.2 WKHTMLTOPDF:我最喜欢的那个!它使用二进制文件来执行pdf制作命令,它易于使用和转换您的HTML 归档为精美的PDF。目前我正在使用它,但你会有一些 生产服务器上执行二进制文件的问题。 1.3 Python PDF Kit:只是另一个pdf工具包。

  2. 搜索可用的csv文件:

    2.1您可以使用django csv:它易于使用,您在创建csv文件时遇到了问题。

  3. 使用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
    
  4. 当访问网址http://yourserver/myview时,它将返回作为搜索结果的视图的html部分。 如果您访问类似http://yourserver/myview?type=csv的网址,则会呈现视图的csv部分。和http://yourserver/myview?type=pdf为您的pdf视图。