【django】アップロードした複数ファイルをviews.pyで取得する方法(getlistメソッド)

2021.02.20 /

【django】アップロードした複数ファイルをviews.pyで取得する方法(getlistメソッド)

本記事ではdjangoによるWebアプリケーションにおける、アップロードした複数ファイルを、views.pyで取得する方法を解説していきます。

djangoでファイルアップロードを行う場合、ファイルが単数・複数かでviews.py側でファイルを取得するためのメソッドが異なります。

単一ファイルでのviews.py側で取得する方法は、以下記事をご参照ください。

本記事で解説するファイルアップロード方法は、モデルを介さずに、かつサーバーにファイルを保存しない方法です。

djangoによるWebアプリケーションの準備

以下の流れでdjangoの準備を進めて、パソコンにローカルWebサーバーを作成しましょう。

  1. Anaconda(アナコンダ)のインストール
  2. XAMPPのインストール
  3. 仮想環境の構築
  4. プロジェクト・アプリケーションの作成

Anaconda(アナコンダ)は以下サイトからインストールをしてください。

Anacondaのインストール

XAMPPのインストールと使用方法については以下記事をご参照ください。

仮想環境の構築については以下記事をご参照ください。

djangoのインストールやプロジェクト・アプリケーションの作成、ローカルサーバーの起動までの一連の流れは以下記事にまとめてありますので、ぜひご参考にしてください。

Webアプリケーション:ソースコード

本章では次の機能を持つWebアプリケーションのソースコードを記します。

  • HTML側で複数のファイル(エクセル)をアップロードできる
  • アップロードしたエクセル内のセルデータをviews.pyで取得
  • 取得したセルデータをHTML側に渡す
  • HTML側で受け取ったセルデータを表示する

複数のエクセルファイルをアップロードするWebアプリケーションの画面は次のようになります。

サンプル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で複数ファイルを扱う方法がネット上にはありませんので、ぜひ本記事を参考にしていただければと思います。