Created
September 6, 2017 00:38
Star
You must be signed in to star a gist
Django custom csv action
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def export_as_csv_action( | |
description="CSV 파일로 출력", fields=None, exclude=None, header=True, force_fields=None): | |
""" | |
CSV 출력을 하는 Django Admin Action Function \n | |
:param description: Action 에 표시할 문구 | |
:param fields: 출력 할 Model Field(Column) | |
:param exclude: 출력에서 제외할 Model Field | |
:param header: Field(Column) 이름을 첫번째 행으로 출력할지 여부 | |
:param force_fields: Django admin 의 list_display 의 Custom field (문자열) 을 사용할 지 여부 False 인 경우 Model 에 없는 필드는 제외한다. | |
""" | |
def export_as_csv(modeladmin, request, queryset): | |
opts = modeladmin.model._meta | |
if not force_fields: | |
field_names = set([field.name for field in opts.fields]) | |
if fields: | |
field_set = set(fields) | |
field_names = field_names & field_set | |
elif fields: | |
field_names = set(fields) | |
else: | |
raise ValueError('올바른 옵션을 넣어주세요.') | |
if exclude: | |
exclude_set = set(exclude) | |
field_names = field_names - exclude_set | |
response = HttpResponse(content_type='text/csv') | |
response['Content-Disposition'] = 'attachment; filename=%s.csv' % str(opts).replace('.', '_') | |
writer = csv.writer(response) | |
if header: | |
writer.writerow(list(field_names)) | |
for obj in queryset: | |
row = [] | |
for field in field_names: | |
try: | |
if callable(getattr(obj, field)): | |
row.append(str(getattr(obj, field)())) | |
else: | |
row.append(str(getattr(obj, field))) | |
except AttributeError: | |
row.append(str((getattr(modeladmin, field)(obj)))) | |
except: | |
raise | |
writer.writerow(row) | |
return response | |
export_as_csv.short_description = description | |
return export_as_csv |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment