Генерация CSV-файла с помощью Django (динамический контент) - PullRequest
7 голосов
/ 01 ноября 2010

Внутри моего 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 ]

7 голосов
/ 02 ноября 2010

Я бы рекомендовал объединить их в одну функцию просмотра, которая принимает дополнительный параметр:

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"),
4 голосов
/ 01 ноября 2010

ИМХО, лучше всего было бы объединить их и генерировать данные 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 установлен в данных сеанса, что может вызвать массу ошибок, а также проблем с безопасностью.Если вы храните сеансы в своей базе данных, вы можете закончить чтение данных, просто записав их обратно в гораздо менее эффективном виде.

0 голосов
/ 20 мая 2013

Следующее получает набор запросов Django и выплевывает файл CSV.

Использование ::

из утилиты import dump2csv

из dummy_appИмпорт моделей. *

qs = DummyModel.objects.all ()

dump2csv.dump (qs, './data/dump.csv')

Сценарий:

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)
0 голосов
/ 02 ноября 2010

Я нашел способ сделать это, отличный от Кнутина.Я объявил пустой список csv_list = [] вне моих функций или глобальной переменной.

В моей основной функции (той, которая обрабатывает и фильтрует на основе ввода пользователя), я делаю этот csv_list глобальным, чтобы он получалустановить "обновленную" версию набора запросов.Затем, чтобы сгенерировать CSV, это так же просто, как: для вызова в csv_list: writer.writerow ([call.src, call.dst]) вернуть ответ

Теперь это работает разумно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...