/django-csv-export-view

Django class-based view for CSV exports

Primary LanguagePythonBSD 3-Clause "New" or "Revised" LicenseBSD-3-Clause

django-csv-export-view

A Django class-based view for CSV export.

Build Status

Features

  • Easy CSV exports by setting a Django model and a fields or exclude iterable
  • Works with existing class-based view mixins for access control
  • Generates Microsoft Excel friendly CSV by default
  • Proper HTTP headers set for CSV
  • Easy to override defaults as needed
  • Easy integration into Django Admin

Installation

pip install django-csv-export-view

Quick Start

Examples:

from csv_export.views import CSVExportView

class DataExportView(CSVExportView):
    model = Data
    fields = ('field1', 'field2__related_field', 'property1')

class DataExportView(CSVExportView):
    model = Data
    fields = '__all__'

class DataExportView(CSVExportView):
    model = Data
    exclude = ('id',)

    def get_queryset(self):
        queryset = super(DataExportView, self).get_queryset()
        return queryset.exclude(deleted=True)

class DataExportView(CSVExportView):
    model = Data

    def get_fields(self, queryset):
        fields = ['username', 'email']
        if self.request.user.is_superuser:
            fields.append('birth_date')
        return fields

fields / exclude: An iterable of field names and properties. You cannot set both fields and exclude. fields can also be '__all__' to export all fields. Model properties are not included when '__all__' is used. Related field can be used with __. Override get_fields(self, queryset) for custom behaviour not supported by the default logic.

model: The model to use for the CSV export queryset. Override get_queryset() if you need a custom queryset.

Further Customization

Examples:

from csv_export.views import CSVExportView

class DataExportView(CSVExportView):
    model = Data
    fields = '__all__'
    header = False
    specify_separator = False
    filename = 'data-export.csv'

class DataExportView(CSVExportView):
    model = Data
    fields = '__all__'

    def get_filename(self, queryset):
        return 'data-export-{!s}.csv'.format(timezone.now())

header - boolean - Default: True
Whether or not to include the header in the CSV.

filename - string - Default: Dasherized version of verbose_name_plural from queryset.model.
Override get_filename(self, queryset) if a dynamic filename is required.

specify_separator - boolean - Default: True
Whether or not to include sep=<sepaator> as the first line of the CSV file. This is useful for generating Microsoft Excel friendly CSV.

CSV Writer Options

Example:

from csv_export.views import CSVExportView

class DataExportView(CSVExportView):
    model = Data
    fields = '__all__'

    def get_csv_writer_fmtparams(self):
        fmtparams = super(DataExportView, self).get_csv_writer_fmtparams()
        fmtparams['delimiter'] = '|'
        return fmtparams

Override get_csv_writer_fmtparams(self) and return a dictionary of csv write format parameters. Default format parameters are: dialect='excel' and quoting=csv.QUOTE_ALL. See all available options in the Python docs:

https://docs.python.org/3.6/library/csv.html#csv.writer

Django Admin Integration

Example:

from django.contrib import admin
from csv_export.views import CSVExportView

@admin.register(Data)
class DataAdmin(admin.ModelAdmin):
    actions = ('export_data_csv',)

    def export_data_csv(self, request, queryset):
        view = CSVExportView(queryset=queryset, fields='__all__')
        return view.get(request)

    export_data_csv.short_description = 'Export CSV for selected Data records'

Contributions

Pull requests are happily accepted.

Alternatives

https://github.com/django-import-export/django-import-export/

https://github.com/mjumbewu/django-rest-framework-csv