2.如何从djagno admin 导出CSV

你被要求可以从admin导出HeroVillanAdmin,有很多第三方模块可以做到。但是不依赖其他项也非常容易。你将添加admin action 到 HeroAdminVillanAdmin

一个admin action可以总是有这样的函数签名(声明) def admin_action(modeladmin, request, queryset):或者你可以直接在ModelAdmin中作为一个方法。

  1. class SomeModelAdmin(admin.ModelAdmin):
  2. def admin_action(self, request, queryset):

为了HeroAdmin添加csv导出,你可以像下面这样做:

  1. actions = ["export_as_csv"]
  2. def export_as_csv(self, request, queryset):
  3. pass
  4. export_as_csv.short_description = "Export Selected"

添加了叫export selected 的action, 就像这样: 2.如何从djagno admin 导出CSV - 图1 你将修改export_as_csv 如下:

  1. import csv
  2. from django.http import HttpResponse
  3. ...
  4. def export_as_csv(self, request, queryset):
  5. meta = self.model._meta
  6. field_names = [field.name for field in meta.fields]
  7. response = HttpResponse(content_type='text/csv')
  8. response['Content-Disposition'] = 'attachment; filename={}.csv'.format(meta)
  9. writer = csv.writer(response)
  10. writer.writerow(field_names)
  11. for obj in queryset:
  12. row = writer.writerow([getattr(obj, field) for field in field_names])
  13. return response

这将导出所有选中行,如果你注意到,export_as_csv 没有Hero的内容,你可以将方法提取成一个mixin类。

进行这些修改之后,你的代码会变成这样:

  1. class ExportCsvMixin:
  2. def export_as_csv(self, request, queryset):
  3. meta = self.model._meta
  4. field_names = [field.name for field in meta.fields]
  5. response = HttpResponse(content_type='text/csv')
  6. response['Content-Disposition'] = 'attachment; filename={}.csv'.format(meta)
  7. writer = csv.writer(response)
  8. writer.writerow(field_names)
  9. for obj in queryset:
  10. row = writer.writerow([getattr(obj, field) for field in field_names])
  11. return response
  12. export_as_csv.short_description = "Export Selected"
  13. @admin.register(Hero)
  14. class HeroAdmin(admin.ModelAdmin, ExportCsvMixin):
  15. list_display = ("name", "is_immortal", "category", "origin", "is_very_benevolent")
  16. list_filter = ("is_immortal", "category", "origin", IsVeryBenevolentFilter)
  17. actions = ["export_as_csv"]
  18. ...
  19. @admin.register(Villain)
  20. class VillainAdmin(admin.ModelAdmin, ExportCsvMixin):
  21. list_display = ("name", "category", "origin")
  22. actions = ["export_as_csv"]

继承ExportCsvMixin类其他的models同样可以导出csv