Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

管理画面のデータをCSVなどの形式でインポート/エクスポートしたくなったので、
調べてみたらdjango-import-exportで簡単にできた。その時の備忘録。

インストール

まずはpipでインストール

$ pip install django-import-export
設定

import_exportをINSTALLED_APPSに追加

# settings.py
INSTALLED_APPS = (
    ...
    'import_export',
)
admin.pyに追加

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

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

# 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を継承したクラスを追加する。
設定関連はココに書いていくらしい。

# 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!

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

スクリーンショット 2019-11-27 13.38.26.png

小ネタ

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

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

# ... 略
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

# ... 略
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で指定できる

以上!!

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

積読用の読書管理アプリ 『積読ハウマッチ』をリリースしました!
積読ハウマッチは、Nuxt.js+Firebaseで開発してます!

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

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

参考にしたサイト様

kira_puka
フリーのエンジニア / 今はNuxt.jsが多め / いつかFlutterをやりたい 受託開発をしながら、アプリ・Webサービス・ゲームを個人開発 Kotlin/Python/Swift/Unity/Java/Haskell/DDD
https://memory-lovers.com
admin-guild
「Webサービスの運営に必要なあらゆる知見」を共有できる場として作られた、運営者のためのコミュニティです。
https://admin-guild.slack.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away