Để cung cấp tính năng xuất dữ liệu dưới dạng file CSV trong Django Admin, bạn có thể sử dụng các hành động tùy chỉnh. Ví dụ sau minh họa cách triển khai:
<h3>Bước 1: Tạo lớp hỗ trợ xuất CSV</h3>
Chúng ta sẽ tạo một lớp hỗ trợ tên là ExportCsvMixin để tái sử dụng cho nhiều mô hình khác nhau.
import csv
from django.http import HttpResponse
class ExportCsvMixin:
def export_to_csv(self, request, queryset):
model_meta = self.model._meta
field_names = [field.name for field in model_meta.fields]
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = f'attachment; filename={model_meta}.csv'
response.charset = 'utf-8-sig'
writer = csv.writer(response)
writer.writerow(field_names)
for obj in queryset:
writer.writerow([getattr(obj, field) for field in field_names])
return response
export_to_csv.short_description = 'Xuất sang CSV'
<h3>Bước 2: Áp dụng Mixin vào lớp Admin</h3>
Sau khi đã có ExportCsvMixin, chúng ta áp dụng nó vào lớp Admin của một mô hình cụ thể.
from django.contrib import admin
from .models import Issue
@admin.register(Issue)
class IssueAdmin(admin.ModelAdmin, ExportCsvMixin):
fields = ('key', 'summary', 'status', 'project',
'origin', 'components', 'prj_level', 'prj_category',
'assignee', 'origin_person', 'pm', 'dev_manager', 'test_manager', 'tester', 'fe_dev', 'backend_dev',
'plan_begin', 'plan_end', 'fe_plan_begin', 'fe_plan_end', 'test_plan_begin',
'test_plan_end', 'backend_plan_begin', 'backend_plan_end',
'created', 'reopen', 'prd_begin', 'prd_end', 'dev_begin', 'dev_end',
'test_begin', 'test_end', 'pm_check', 'ready', 'pause', 'done',
'pm_take', 'dev_take', 'test_take', 'total_take',
'tags')
readonly_fields = fields
list_display = ('key', 'summary', 'status', 'origin', 'components', 'created', 'visit')
list_filter = ('origin', 'components', 'status', 'tags')
search_fields = ('key', 'summary')
date_hierarchy = 'created'
actions = ['export_to_csv']
<h3>Kết quả</h3>
Khi thực hiện hành động "Xuất sang CSV" trên trang quản trị Django, hệ thống sẽ tự động tải xuống file CSV chứa dữ liệu được chọn từ danh sách hiển thị.