• Django Admin Cookbook-13如何从Django Admin后台中导出CSV


    2.如何从Django Admin后台中导出CSV?

    假设你需要在Admin后台中,增加从导出Hero和导出Villain数据的功能。有许多Django第三方插件可以实现此操作,但是要自己实现也非常容易。你需要再HeroAdmin和VillanAdmin两个管理模型中添一个额外动作。

    Admin后台操作方法的签名是固定的,def admin_action(modeladmin, request, queryset):,你可以直接作为方法添加到你的管理模型中。

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

    要将csv导出功能添加到HeroAdmin管理模型中,你可以修改如下:

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

    这将为后台添加一个名为export selected的额外操作,效果如下:

    然后,将export_as_csv方法完善为:

    import csv
    from django.http import HttpResponse
    ...
    def export_as_csv(self, request, queryset):
        meta = self.model._meta
        field_names = [field.name for field in meta.fields]
        response = HttpResponse(content_type='text/csv')
        response['Content-Disposition'] = 'attachment; filename={}.csv'.format(meta)
        writer = csv.writer(response)
        writer.writerow(field_names)
        for obj in queryset:
            row = writer.writerow([getattr(obj, field) for field in field_names])
        return response
    

    这将导出所有选定的行。如果你注意到,export_as_csv方法并不依赖Hero模型,因此可以将该方法封装到一个mixin类中。

    将代码修改如下:

    class ExportCsvMixin:
        def export_as_csv(self, request, queryset):
            meta = self.model._meta
            field_names = [field.name for field in meta.fields]
            response = HttpResponse(content_type='text/csv')
            response['Content-Disposition'] = 'attachment; filename={}.csv'.format(meta)
            writer = csv.writer(response)
            writer.writerow(field_names)
            for obj in queryset:
                row = writer.writerow([getattr(obj, field) for field in field_names])
            return response
        export_as_csv.short_description = "Export Selected"
    @admin.register(Hero)
    class HeroAdmin(admin.ModelAdmin, ExportCsvMixin):
        list_display = ("name", "is_immortal", "category", "origin", "is_very_benevolent")
        list_filter = ("is_immortal", "category", "origin", IsVeryBenevolentFilter)
        actions = ["export_as_csv"]
    ...
    @admin.register(Villain)
    class VillainAdmin(admin.ModelAdmin, ExportCsvMixin):
        list_display = ("name", "category", "origin")
        actions = ["export_as_csv"]
    

    你可以在管理模型中,通过继承ExportCsvMixin来为该模型添加导出CSV功能。

    返回目录

  • 相关阅读:
    PHPEXCEL 导出多个sheet
    android adb.exe端口占用
    imageview 显示assets的图片

    Java中日期问题
    java中的定时器的实现样例
    Oracle数据库如何干净的删除
    MySQL索引相关知识
    JavaScript基础知识总结
    JDBC技术总结
  • 原文地址:https://www.cnblogs.com/superhin/p/12171715.html
Copyright © 2020-2023  润新知