在django模板中下载csv

时间:2009-11-02 10:42:47

标签: django csv

在django应用中,我需要显示搜索结果,并让用户下载结果的csv文件
实际上我只是编写了一个视图,它使用形式args通过ORM进行查询,并将结果显示在模板的表中。

这里是观点的结尾:

return render_to_response(template, {'form': form, 'object_list': object_list}, context_instance=RequestContext(request))

我想在表格下方添加一个下载所提供结果的csv文件的链接。 我知道如何在python / django中创建一个csv文件,但不知道如何在模板中同时显示它。

任何想法? 感谢提前回答。

2 个答案:

答案 0 :(得分:7)

我的建议是在urls.py中为csv下载链接创建一个新条目,并将其连接到返回csv的视图。

然后,在搜索结果的模板中,您可以链接到此新网址,传递与GET参数相同的搜索字词,您可以在CSV视图中使用这些参数再次生成结果。

为了减少重复,因为您现在拥有正常的html视图和csv视图处理返回相同的数据,您可以创建一个带有参数的视图,该参数指定它是应该返回渲染模板还是CSV结果。

您提到您已经知道如何执行此操作,但万一其他人偶然发现此页面,以下是视图如何返回CSV并使浏览器将其作为文件下载:

def csv_list(request):
    """ Renders a csv list  """
    response = HttpResponse(mimetype='text/csv')
    response['Content-Disposition'] = 'attachment; filename=file.csv'

    writer = csv.writer(response, dialect=csv.excel)
    writer.writerow(['col1', 'col2', 'col3'])
    return response

答案 1 :(得分:1)

如果用户已填写包含查询参数的表单,则需要再次将这些参数提供给视图,以呈现CSV文件。为此,您可以在模板中的表单中使用隐藏字段,并将重新提交的提交按钮重新发送到正确的视图。

如果您希望CSV的链接是一个简单的GET,您必须生成链接,以便在查询字符串中传递所有这些参数。如果参数不是太多,您可以在URL中使用带有这些参数的自定义URLconf。在最后一种情况下,渲染CSV的独立视图可能会更好,因此在渲染HTML时,视图中没有太多的params默认为None。