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

时间:2010-11-01 19:56:39

标签: python django csv

在我的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列表,并在我的export_to_csv函数中使用它。 或者最好的方法是组合这两个功能,并让用户点击一个复选框,无论他/她是否要下载CSV文件。 任何帮助将不胜感激。

4 个答案:

答案 0 :(得分: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))

然后,在urls.py中,在urlpatterns

中添加类似内容
url(r'^form', 'my_view', {"exportCSV": False}, name="form"),
url(r'^csv', 'my_view', {"exportCSV": True}, name="export"),

答案 1 :(得分:4)

恕我直言,最好的方法是将它们组合起来并从显式查询集生成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,这可能会导致大量错误以及安全问题。如果您在数据库中存储会话,您可能最终会读取数据,只是以效率低得多的形式将其写回来。

答案 2 :(得分:0)

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

在我的main函数(根据用户输入处理和过滤的函数)中,我将此csv_list设置为全局,以便将其设置为查询集的“已更新”版本。 然后生成csv,它就像:     用于csv_list中的调用:         writer.writerow([call.src,call.dst])     回复

现在它正在合理地工作。

答案 3 :(得分:0)

以下内容包含Django查询集并吐出CSV文件。

用法::

  
    

来自utils import dump2csv

         

来自dummy_app.models import *

         

qs = DummyModel.objects.all()

         

dump2csv.dump(qs,'。/ data / dumpcsv')

  

剧本:

import csv
from django.db.models.loading import get_model

def dump(qs, outfile_path):

    model = qs.model
writer = csv.writer(open(outfile_path, 'w'))

headers = []
for field in model._meta.fields:
    headers.append(field.name)
writer.writerow(headers)

for obj in qs:
    row = []
    for field in headers:
        val = getattr(obj, field)
        if callable(val):
            val = val()
        if type(val) == unicode:
            val = val.encode("utf-8")
        row.append(val)
    writer.writerow(row)