【django】アップロードした複数ファイルをviews.pyで取得する方法(getlistメソッド)
2021.02.20 /
本記事ではdjangoによるWebアプリケーションにおける、アップロードした複数ファイルを、views.pyで取得する方法を解説していきます。
djangoでファイルアップロードを行う場合、ファイルが単数・複数かでviews.py側でファイルを取得するためのメソッドが異なります。
単一ファイルでのviews.py側で取得する方法は、以下記事をご参照ください。
【Django】アップロードされたファイルをサーバーへ保存しないでview.py側で操作をする方法
本記事で解説するファイルアップロード方法は、モデルを介さずに、かつサーバーにファイルを保存しない方法です。
djangoによるWebアプリケーションの準備
以下の流れでdjangoの準備を進めて、パソコンにローカルWebサーバーを作成しましょう。
- Anaconda(アナコンダ)のインストール
- XAMPPのインストール
- 仮想環境の構築
- プロジェクト・アプリケーションの作成
Anaconda(アナコンダ)は以下サイトからインストールをしてください。
XAMPPのインストールと使用方法については以下記事をご参照ください。
【PHP】XAMPPのインストール方法と操作方法【初心者用】
仮想環境の構築については以下記事をご参照ください。
【Python】仮想環境の構築と有効化の方法
djangoのインストールやプロジェクト・アプリケーションの作成、ローカルサーバーの起動までの一連の流れは以下記事にまとめてありますので、ぜひご参考にしてください。
【django】Webサイト・アプリを作成するまでの一連の流れ
Webアプリケーション:ソースコード
本章では次の機能を持つWebアプリケーションのソースコードを記します。
- HTML側で複数のファイル(エクセル)をアップロードできる
- アップロードしたエクセル内のセルデータをviews.pyで取得
- 取得したセルデータをHTML側に渡す
- HTML側で受け取ったセルデータを表示する
複数のエクセルファイルをアップロードするWebアプリケーションの画面は次のようになります。
urls.py
from django.urls import path
from . import views
app_name = 'upload'
urlpatterns = [
path('', views.index, name='index'),
]
views.py
from django.shortcuts import render
import openpyxl
def index(request):
context = {}
if request.method == 'POST' and request.FILES['excel']:
values = {}
for excel in request.FILES.getlist('excel'):
wb = openpyxl.load_workbook(excel)
ws = wb.active
values.append(ws['A1'].value)
context = {'values':values,}
return render(request, 'index.html', context)
index.html
<html>
<body>
<form class="" method="POST" enctype="multipart/form-data">
{% csrf_token %}
<p>EXCEL: <input type="file" multiple name="excel" value="" required></p>
<p><input type="submit" name="btn_upload" value="UPLOAD"></p>
</form>
{% if values %}
{% for value in values %}
<p>{{ value }}</p>
{% endif %}
</body>
</html>
Webアプリケーション:解説
inputタグ:複数ファイルのアップロード
エクセルファイルをアップロードするためにinputタグを使用します。
Webアプリケーションでは次のようにinputタグを使用しています。
<input type="file" multiple name="excel" value="" required>
inputタグにmultipleを加えることで、複数のファイルを選択できるようになります。
エクセルファイル:アップロード判定
formからエクセルファイルが送信されたかは、views.py内で次のようにして判定することができます。
if request.method == 'POST' and request.FILES['excel']:
複数ファイルの取得
formタグからアップロードされたファイルはrequest.FILES(辞書型)に格納されています。
このrequest.FILESに対してgetlist()メソッドを使用することで各ファイルのリストを取得できます。
requestFILES.getlist()
getlist()メソッドの引数には、inputタグのname名を指定します。
アップロードした複数ファイルにアクセスするために、for文を使用します。
Webアプリケーションでは次のように使用しています。
for excel in request.FILES.getlist('excel'):
wb = openpyxl.load_workbook(excel)
ws = wb.active
values.append(ws['A1'].value)
このようにして、アップロードした複数ファイルを操作することができます。
getlist()を使用せずに、request.FILES['excel']でアップロードファイルにアクセスすると、最後にアップロードされたファイルを取得することになります。
まとめ
本記事「【django】アップロードした複数ファイルをviews.pyで取得する方法(getlistメソッド)」はいかがでしたか。
djangoで複数ファイルを扱う方法がネット上にはありませんので、ぜひ本記事を参考にしていただければと思います。