djangoの画像の複数アップロード

djangoの公式ドキュメントにシンプルな複数アップロードのサンプルが載ってなかったので、試してみたでござる

""" imagetest/models.py """
from django.db import models


class SimplePhoto(models.Model):
    img = models.ImageField(upload_to='images/')

モデル

""" imagetest/views.py """
from django.shortcuts import render, redirect
from .models import SimplePhoto
from .forms import SimplePhotoForm, PhotosForm


def index(req):
    images = SimplePhoto.objects.all()
    if req.method == 'POST':
        f = SimplePhotoForm(req.POST, req.FILES)
        if f.is_valid():
            f.save()
    else:
        f = SimplePhotoForm()
    return render(req, 'imagetest/index.html', {'images': images, 'form': f})

def multiple(req):
    images = SimplePhoto.objects.all()
    if req.method == 'POST':
        form = PhotosForm(req.POST, req.FILES)
        if form.is_valid():
            for ff in req.FILES.getlist('photos_field'):
                p = SimplePhoto(img=ff)
                p.save()
    else:
        form = PhotosForm()
    return render(req, 'imagetest/index.html', {'images': images, 'form': form})

一つのと複数アップロードのビュー

""" imagetest/urls.py """
from django.urls import path
from .views import index, multiple


urlpatterns = [
        path('',index),
        path('multiple/',multiple),
]

urlの設定。ルートから伸ばしてるけど省略。

""" imagetest/forms.py """
from django import forms
from .models import SimplePhoto


class SimplePhotoForm(forms.ModelForm):
    class Meta:
        model = SimplePhoto
        fields = ['img',]

class PhotosForm(forms.Form):
    photos_field = forms.ImageField(
            widget=forms.ClearableFileInput(attrs={'multiple': True}))

複数でもModelForm使えるかなと思ったけどダメだった。saveで拡張するらしい。

<html>
    <head>
       <title>ImageTest</title>
   </head>
    <body>
        {% for img in images %}
        <img src="{{ img.img.url }}" />
        {% endfor %}
        <form method="POST" enctype="multipart/form-data">
            {% csrf_token %}
            {{ form }}
            <input type="submit" value="送信">
        </form>
    </body>
</html>

単数の画像アップロードは公式ドキュメントそのまんまのやつ。 複数の場合はrequest.FILES.getlist['field_name']しないとだめ。formのcleaned_dataから引っ張り出してイテレーションすると引っ張り出してきたファイルはbytesでUploadedFileじゃないのでそのままモデルの渡して保存できない。 htmlのenctypeをmultipartにするのとstaticurlの設定を忘れないようにしないとな。

ちょうどMXでランサーが死んで麻婆神父が出てた