Django 管理员将数据下载为 csv

alc*_*der 3 python django django-admin

我想从 django admin 下载数据作为 .csv 文件。我遵循教程https://www.endpoint.com/blog/2012/02/22/dowloading-csv-file-with-from-django

我没有看到下载 csv 选项。我该如何解决我的问题?

在此输入图像描述

我正在使用Python3,创建了迁移。

这是我的代码

模型.py

from django.db import models
from django.contrib import admin


class Stat(models.Model):
    code = models.CharField(max_length=100)
    country = models.CharField(max_length=100)
    ip = models.CharField(max_length=100)
    url = models.CharField(max_length=100)
    count = models.IntegerField()


class StatAdmin(admin.ModelAdmin):
    list_display = ('code', 'country', 'ip', 'url', 'count')
    def download_csv(self, request, queryset):
        import csv
        f = open('some.csv', 'wb')
        writer = csv.writer(f)
        writer.writerow(["code", "country", "ip", "url", "count"])
        for s in queryset:
            writer.writerow([s.code, s.country, s.ip, s.url, s.count])

admin.site.register(Stat, StatAdmin)
Run Code Online (Sandbox Code Playgroud)

Art*_*ege 7

如果你想在本地保存文件,@Ben 的解决方案是有效的,而且还有一个小错误<如果我们要在那里写入一些字符串,我们应该将文件打开为“w”,而不是“wb”。

这个解决方案对我有用(您可以将其直接粘贴到您的 model.Admin 子类,admin 类中):

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"
Run Code Online (Sandbox Code Playgroud)

然后在 model.Admin 中:

actions = ("export_as_csv",)
Run Code Online (Sandbox Code Playgroud)

单击此处查看来源。

此外,还有一些库可以一键保存文件:例如django-import-export 。


Ben*_*Ben 5

您需要将其download_csv作为操作添加到StatAdmin班级中。 https://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/#adding-actions-to-the-modeladmin

def download_csv(modeladmin, request, queryset):
    import csv
    f = open('some.csv', 'wb')
    writer = csv.writer(f)
    writer.writerow(["code", "country", "ip", "url", "count"])
    for s in queryset:
        writer.writerow([s.code, s.country, s.ip, s.url, s.count])


class StatAdmin(admin.ModelAdmin):
    list_display = ('code', 'country', 'ip', 'url', 'count')
    actions = [download_csv]
Run Code Online (Sandbox Code Playgroud)