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でランサーが死んで麻婆神父が出てた