djangoのadminにファイルアップロード機能をつけてみる
djangoのadminからcsvファイルやExcelをアップロードしてデータの一括インポートとか出来たらいいなー。と思ったので実際にやってみました。
最初は普通に
<form action="/hoge/" method="post" enctype="multipart/form-data"> <input type="file" name="uploadfile"> <input type="submit" value="アップロード"> </form>
とadminのテンプレートに記述してaction先にファイルのアップロードスクリプトを書きまして。
これで普通に動くだろーと思ったんですがこれが上手くいきませんでした。
action先を指定してsubmitしても、直接action先には飛ばず、djangoのviewに吸収されてしまうため意図したように動きませんでした。
何か良い方法はないものだろうかと思いつつ、Djangoのドキュメントを調べてみるとsave_modelなるメソッドがありました。
このメソッドをフックにしてデータの一括インポート機能が実装できました。
def save_model(self, request, obj, form, change): if 'uploadfile' in request.FILES: excel_file = request.FILES['uploadfile'] excel_name, ext = os.path.splitext(excel_file.name) if ext == ".xls" or ext == "xlsx": self.file_upload(request.FILES['uploadfile']) def file_upload(self, excel): destination = open('アップロード先のパス', "wb+") for chunk in excel.chunks(): destination.write(chunk) destination.close()