[英]Generating CSV file with Django (dynamic content)
在我的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
我不知道如何從我的第一個功能,它包含我想在我的CSV和我export_to_csv功能使用它的項目清單得到查詢集 。 或者最好的方法是組合這兩個功能,並讓用戶點擊一個復選框,無論他/她是否要下載CSV文件。 任何幫助,將不勝感激。
我建議將這些組合成一個視圖函數,它需要一個額外的參數:
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
這樣的urlpatterns
:
url(r'^form', 'my_view', {"exportCSV": False}, name="form"),
url(r'^csv', 'my_view', {"exportCSV": True}, name="export"),
恕我直言,最好的方法是將它們組合起來並從顯式查詢集生成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在會話數據中設置,這可能會導致大量的錯誤以及安全問題。 如果您在數據庫中存儲會話,您最終可能會讀取數據,只是以效率低得多的形式將其寫回來。
以下內容包含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)
我找到了一種與knutin不同的方法。 我在我的函數或全局變量之外聲明了一個名為csv_list = []的空列表。
在我的主函數(基於用戶輸入處理和過濾的函數)中,我將此csv_list設置為全局,以便將其設置為查詢集的“更新”版本。 然后生成csv,就像在csv_list中調用一樣簡單:writer.writerow([call.src,call.dst])返回響應
它現在合理地運作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.