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でも色々できるようになってきた。