DjangoのClass-Based Viewsでcsvファイルのエクスポート

こんなことをしたかった

  • ListViewで作った一覧を、csvでエクスポートしたかった

DjangoにてWebシステムを作ったりしているのだけれども、csvファイルでエクスポートを行いたかった。

ちょっと調べれば出てくるには出てくるのだが、Function-Based Viewsのものばかりだったので、ListView内で処理したものをメモ代わりに書こうと思う。

こんな感じ

models.pyやらurls.pyは省略。 ※動かなかったらごめんなさい

*views.py

import csv
from django.http import HttpResponse
from django.views.generic import ListView
from .models import Model

class ListView(ListView):
    model = Model
    template_name = 'list.html'

    def get(self, request, *args, **kwargs):
        if "export" in request.GET:
            response = HttpResponse(content_type='text/csv')
            response['Content-Disposition'] = 'attachment; filename="export.csv"'
            writer = csv.writer(response)
            for model in Model.objects.all():
                writer.writerow([エクスポートしたい値])
            return response
        else:
            return super().get(self, request, *args, **kwargs)

*list.html

<form action="{% url "listviewのパス" %}" method="get">
     {% csrf_token %}
     <button type="submit" name="export" value="1">button</button>
</form>

ようするに、getをオーバーライドして、パラメータにexportがあればCSV出力、そうでなければsuper()のgetを呼び出し通常処理させる、といった実装。

実装してみて

ブログには記載していないが先日もGoogle Calendar APIをTemplateView内に組み込んだりもして、なんとかClass-Based Viewsでも色々できるようになってきた。

参考文献

Django、CSVのインポート・エクスポート - Narito Blog