diadia

興味があることをやってみる。自分のメモを残しておきます。

CSVファイルを受け取る機能(アップロード機能)について

csv関連の資料

https://docs.djangoproject.com/ja/2.1/topics/http/file-uploads/ https://qiita.com/otera05/items/25d5bad759d39d61bc40

 

html上でどのような記述が必要か(試行錯誤過程)

文字列においてはformタグ内にinputやbuttonを設置することで、サーバーサイドで当該文字列を受け取ることが出来た。音声ファイルや映像ファイルそしてcsvファイルに対応するformやinput等は何なのか?ここが分かっていない。
調べたところinputタグの属性としてtype="file"なるものがあるらしい。これを試してみようと思う。

html上でどのような記述が必要か(結論)

こちらの情報通りでうまくいった。
http://www.htmq.com/html5/input_type_file.shtml
ファイルのやり取りにおいてformタグではenctype="multipart/form-data"が必要。またinputタグではtype="file"が必要。これが知らなかった情報だった。

file受取り時の挙動をコントロールしたい

文字列の情報はrequest.POSTに当該情報が辞書型のようなデータとして格納された。だから辞書型データのように取り出せば文字列を扱うことが出来た。csvファイルのようなデータはどのように扱えばよいのか?ここが知らない。csvモジュールを使えばよいのか?またcsvファイルを受け取ったら、そのデータをもとにクラスインスタンスを作成したい。おそらくcsvファイルの受け取りとその中身の読み取りさえできれば、問題は解決するだろう。

file受取り時の挙動をコントロールする

こちらの情報が参考になった。
https://docs.djangoproject.com/ja/2.1/topics/http/file-uploads/#basic-file-uploads
https://docs.djangoproject.com/ja/2.1/ref/request-response/#django.http.HttpRequest.FILES
以下のような感じでコードを書いてみた。

hoge/views.py ...

class ReceiveFileView(View):


    def get(self, request, *args, **kwargs):
		return render(request, 'hoge/receiving_csv.html')

    def post(self, request, *args, **kwargs):
		print(request.FILES)
		print(dir(request.FILES))
		return render(request, 'hoge/receiving_csv.html')
hoge/receiving_csv.html ...

<form action="{% url 'hoge:receive_file' %}" enctype="multipart/form-data" method="POST">
{% csrf_token %}
<input type="file" />     # name="csv"をinputタグの属性として入れること
<button type="submit">ファイルを送信する</button>
</form>

inputタグにname属性を入れなかったせいでrequest.FILESにファイルが格納されず、時間を費やしてしまった。辞書型データとして格納するためにkeyの代わりにnameが必要だとわかった。また、辞書型データとして格納するためには他にも条件がドキュメントに書いてある。ファイルはリクエストポストで送信すること。その他にformタグにenctype="multipart/form-data"を記述していることだった。