在我的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文件。 任何帮助将不胜感激。
答案 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)
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)