用Django生成CSV文件(动态内容)

2024-05-05 15:41:50 发布

您现在位置:Python中文网/ 问答频道 /正文

在view.py中,我有两个函数,一个处理表单输入并输出筛选列表,另一个将此列表导出到CSV。

下面是我的第一个函数的返回:

return render_to_response('templateX.html',
{
 'queryset': queryset,
 'filter_form': filter_form,
 'validated': validated,
},
 context_instance = RequestContext(request)
 )

以下是导出函数:

def export_to_csv(request):
    # get the response object, this can be used as a stream.
    response = HttpResponse(mimetype='text/csv')
    # force download.
    response['Content-Disposition'] = 'attachment;filename=export.csv'
    # the csv writer
    writer = csv.writer(response)
    qs = request.session['queryset']
    for cdr in qs:
        writer.writerow([cdr['calldate'], cdr['src'], cdr['dst'], ])
    return response   

我不知道如何从我的第一个函数中获取queryset,该函数包含我希望在CSV中使用的项目列表,并在导出到CSV函数中使用它。 或者最好的方法是将这两个功能结合起来,让用户单击复选框,确定他/她是否想下载CSV文件。 任何帮助都将不胜感激。


Tags: csvto函数form列表returnresponserequest
3条回答

我建议将它们组合成一个视图函数,该函数需要一个额外的参数:

def my_view(request, exportCSV):
    # ... Figure out `queryset` here ...

    if exportCSV:
        response = HttpResponse(mimetype='text/csv')
        response['Content-Disposition'] = 'attachment;filename=export.csv'
        writer = csv.writer(response)
        for cdr in queryset:
            writer.writerow([cdr['calldate'], cdr['src'], cdr['dst'], ])
        return response
    else:
        return render_to_response('templateX.html', {'queryset': queryset,
            'filter_form': filter_form, 'validated': validated},
            context_instance = RequestContext(request))

然后,在您的urls.py中,在您的urlpatterns中放置类似的内容:

url(r'^form', 'my_view', {"exportCSV": False}, name="form"),
url(r'^csv', 'my_view', {"exportCSV": True}, name="export"),

IMHO,最好是将它们组合起来,并从显式queryset生成CSV数据。然后可以将其重写为一般的内容,如(未经测试):

def export_to_csv(request, queryset, fields):
    response = ...
    writer = csv.writer(response)
    for obj in queryset:
        writer.writerow([getattr(obj, f) for f in fields])
    return response

你可以这样使用:

def my_view(request):
    calls = Call.objects.all()
    return export_to_csv(request, calls, fields = ('calldate', 'src', 'dst'))

--

您提供的示例代码假设在会话数据中设置了QuerySet,这可能会导致大量的错误和安全问题。如果您将会话存储在数据库中,您可能最终会读取数据,只是以一种效率低得多的形式将其写回。

我找到了一种不同于克努丁的方法。 我在函数或全局变量之外声明了一个名为csv_list=[]的空列表。

在我的主函数(基于用户输入进行处理和过滤的函数)中,我将这个csv_列表设置为全局的,以便将其设置为queryset的“更新”版本。 然后,要生成csv,很简单: 对于csv_列表中的调用: writer.writerow([call.src,call.dst]) 返回响应

现在运转正常了。

相关问题 更多 >