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()