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

chi*_*rox 7 python csv django

在我的view.py中,我有两个函数,一个处理来自表单的输入并输出一个已过滤的列表,另一个用于将此列表导出为CSV.

这是我的第一个函数的返回:

return render_to_response('templateX.html',
{
 'queryset': queryset,
 'filter_form': filter_form,
 'validated': validated,
},
 context_instance = RequestContext(request)
 )
Run Code Online (Sandbox Code Playgroud)

这是导出功能:

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   
Run Code Online (Sandbox Code Playgroud)

我不知道如何让查询集从我的第一个功能,它包含我想在我的CSV和我export_to_csv功能使用它的项目的列表.或者最好的方法是组合这两个功能,并让用户点击一个复选框,无论他/她是否要下载CSV文件.任何帮助,将不胜感激.

Mik*_*one 7

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

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))
Run Code Online (Sandbox Code Playgroud)

然后,在你的urls.py,把这样的东西放在你的urlpatterns:

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