質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

Q&A

解決済

1回答

2730閲覧

djangoで複数の画像をアップロードしたい

yamatar

総合スコア4

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

0グッド

0クリップ

投稿2020/10/02 07:42

編集2020/10/05 00:17

前提・実現したいこと

以下のサイトを参考に複数の画像のアップロードをしたいのですが、
送信ボタンを押してもエラーもでず、何も起きません。
何がいけないのか全く分からず困っておりますのでご教示お願いいたします。

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

エラー内容

列"geom"内のNULL値はNOT NULL制約違反です
DETAIL: 失敗した行は(10, , null, image/xxxx.JPG)を含みます

HTMLのinputタグを自作から{{form}}に変更したところ、上記のエラーが発生しましたので、
geomをNOT NULLを削除したところ、複数の画像ファイルがデータベースに登録できました。
しかし画像ファイルが個別に登録されています。
個別に登録するのではなく、id1やid2のimageに入れ込みたいです。

api

1[{ 2 "id": 1, 3 "name": "xxxx", 4 "image": null, 5 "geom": { 6 "type": "Polygon", 7 "coordinates": [ 8 [[ポリゴンの緯度経度],[ポリゴンの緯度経度],...] 9 ] 10 }}, 11{ 12 "id": 2, 13 "name": "xxxx2", 14 "image": null, 15 "geom": { 16 "type": "Polygon", 17 "coordinates": [ 18 [[ポリゴンの緯度経度],[ポリゴンの緯度経度],...] 19 ] 20 }}, 21 { 22 "id": 14, 23 "name": "", 24 "image": "http://127.0.0.1:8000/media/image/xxxx.JPG", 25 "geom": null 26 }, 27 { 28 "id": 15, 29 "name": "", 30 "image": "http://127.0.0.1:8000/media/image/xxxx2.JPG", 31 "geom": null 32 }

該当のソースコード

python

1# models.py 2from django.contrib.gis.db import models 3import os 4 5def get_img_upload_path(instance, filename): 6 return os.path.join('image/',filename) 7 8class area(models.Model): 9 name = models.CharField(max_length=50) 10 image = models.ImageField('画像', upload_to=get_img_upload_path, blank=True) 11 geom = models.PolygonField(srid=4326) 12 13 def __str__(self): 14 return self.name

python

1# forms.py 2from django import forms 3from .models import area 4 5class imgForm(forms.ModelForm): 6 image = forms.ImageField( 7 widget=forms.ClearableFileInput(attrs={'multiple': True}), 8 ) 9 class Meta: 10 model = area 11 fields = ('image',)

python

1#views.py 2from .forms import imgForm 3from django import forms 4@user_passes_test(lambda u: u.is_superuser)#superuserのみアクセス可能 5def upload(request): 6 if request.method == 'POST': 7 form = imgForm(request.POST, request.FILES) 8 if form.is_valid(): 9 for ff in request.FILES.getlist('image'): 10 p = area(image=ff) 11 p.save() 12 else: 13 form = imgForm() 14 return render(request, 'map/upload.html', {'form': form})

html

1<!--upload.html--> 2<body> 3<center> 4 <form action="" method="POST" enctype="multipart/form-data" style="margin: 20px;"> 5 {% csrf_token %} 6 <p>アップロードする画像を選択して下さい。</br> 7      <同時に複数の画像を選択できます></p> 8 {{ form }}<!--修正した--> 9 <br> 10 <button id="sending" type="submit">送信</button> 11 </form> 12 13</center> 14</body> 15コード

試したこと

本当はdjangoの管理画面上で複数アップロードが出来るようにしたかったのですが、
管理画面での実施情報がなかったので、アップロード用のHTMLを作成しました。
django管理画面で実施方法も教えていただきたいです。
![イメージ説明

補足情報(FW/ツールのバージョンなど)

django3.0.7
python3.6
windows

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

python

1# views.py 2def upload(request): 3 if request.method == 'POST': 4 form = imgForm(request.POST, request.FILES) 5 if form.is_valid(): 6 for ff in request.FILES.getlist('image'): 7         p = area.objects.get(pk=1) #入れたい場所のpk 8         p.image = ff 9 p.save() 10 else: 11 form = imgForm() 12 return render(request, 'map/upload.html', {'form': form})

このやり方だと最後の画像ファイルしかDB登録されない。p.image.push(ff)すると、
'ImageFieldFile' object has no attribute 'push'のエラー発生した。
ImageFieldにリストは入れられないのかな?
知っている方がいましたらコメント下さい。
とりあえず当初の目標は達成できたので、一旦閉じます。

投稿2020/10/05 06:20

編集2020/10/05 06:22
yamatar

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問