django-import-exportで管理画面にCSVエクスポート機能を追加する

Djangoのadminサイト、調べてみるといろいろプラグインがあるらしい。

管理画面のデータをCSVなどの形式でインポート/エクスポートしたくなったので、
調べてみたら[django-import-export](https://django-import-export.readthedocs.io/en/stable/index.html)で簡単にできた。その時の備忘録。

##### インストール

まずはpipでインストール

```shell
$ pip install django-import-export
```

##### 設定

`import_export`をINSTALLED_APPSに追加

```python
# settings.py
INSTALLED_APPS = (
    ...
    'import_export',
)
```

##### admin.pyに追加

対象のデータに対する設定を追加していく。

サンプルのモデルはこんな感じ。

```python
# models.py
class Book(models.Model):
    name = models.CharField('Book name', max_length=100)
    author = models.CharField('Book name', max_length=100)
```

django-import-exportの設定。

対象とするモデルに対して`ModelResource`を継承したクラスを追加する。
設定関連はココに書いていくらしい。

```python
# admin.py
from django.contrib import admin
from import_export import resources
from import_export.admin import ImportExportModelAdmin

from .models import Book

class BookResource(resources.ModelResource):
    # Modelに対するdjango-import-exportの設定
    class Meta:
        model = Book


@admin.register(Book)
class BookAdmin(ImportExportModelAdmin):
    # ImportExportModelAdminを利用するようにする
    ordering = ['id']
    list_display = ('id', 'title', 'author')

    # django-import-exportsの設定
    resource_class = BookResource
```

最後に、ImportExportModelAdminを継承したAdminクラスを用意して、
resource_classに`ModelResource`を継承したクラスを設定すればOK!

すると、こんな感じにボタンが表示される。簡単(*´ω｀*)

<img width="221" alt="スクリーンショット 2019-11-27 13.38.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/aaaac4b5-e0dd-97ff-6391-a57c9d27ad63.png">


#### 小ネタ

##### Exportだけにする: Importを無効化

インポートは別にいらないなと思ったので、無効化してみた。
`ExportMixin`だけにするといいらしい。

```python
# ... 略
from import_export.admin import ExportMixin

@admin.register(Book)
class BookAdmin(ExportMixin, admin.ModelAdmin):
    # ExportMixinをadmin.ModelAdminに追加すればOK
    ordering = ['id']
    list_display = ('id', 'title', 'author')

    # django-import-exportsの設定
    resource_class = BookResource
```

##### Exportできるフォーマットを指定する

デフォルトだとJSONとかYMLとかいろいろ選べるけどCSVだけでいいので、
選択できる部分を絞ってみた。formatsを指定すればOK

```python
# ... 略
from import_export.formats import base_formats

@admin.register(Book)
class BookAdmin(ImportExportModelAdmin):
    ordering = ['id']
    list_display = ('id', 'title', 'author')

    # django-import-exportsの設定
    resource_class = BookResource
    formats = [base_formats.CSV] # formatsで指定できる
```

以上!!

## こんなのつくってます!!

積読用の読書管理アプリ 『積読ハウマッチ』をリリースしました！
[積読ハウマッチ](https://tsundoku.site)は、Nuxt.js+Firebaseで開発してます!

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/572d4947-f40b-e4dc-1c9c-bc584cd2a66c.png" width="200"/>

もしよかったら、遊んでみてくださいヽ(=´▽`=)ﾉ

要望・感想・アドバイスなどあれば、
公式アカウント([@MemoryLoverz](https://twitter.com/MemoryLoverz))や開発者([@kira_puka](https://twitter.com/kira_puka))まで♪


# 参考にしたサイト様
- [Django import / export — django-import-export 1.2.0 documentation](https://django-import-export.readthedocs.io/en/stable/index.html#)
- [Django import-export: only export - Stack Overflow](https://stackoverflow.com/questions/29252500/django-import-export-only-export)
- [How to have only CSV, XLS, XLSX options in django-import-export? - Stack Overflow](https://stackoverflow.com/questions/45930421/how-to-have-only-csv-xls-xlsx-options-in-django-import-export)