簡體   English   中英

使用Django生成CSV文件(動態內容)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM