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

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

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

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

アップロード

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

Q&A

受付中

dajngoで複数formで1つのform保存後に2つ目のformを保存する

con2319
con2319

総合スコア50

Django

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

アップロード

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

0回答

0グッド

0クリップ

60閲覧

投稿2023/01/25 17:24

編集2023/01/29 16:43

前提

バージョンは以下のものになります。
python:3.8.12
django:3.2.5
pillow:9.0.1

実現したいこと

dajngoでタイトル、カテゴリ、ファイル(multiple有効)のformを設定し2つのformの内の
1つ目のform(form①)でタイトル、カテゴリ、保存した時間を保存する。
その後、form①で保存したレコードのidを2つ目のformで
複数画像ファイルと一緒に順番に保存していく。
1つ目の保存したレコードのid値は1回保存した時は全て同じ値とする。
(画像を取得する時にform②のid値を外部キーとしてform①のid値毎に関わる画像取得するため)

発生している問題・エラーメッセージ

form①ではレコードをformに沿って保存できるのですが、form①のレコードのid値を基に画像を 保存しようとするとうまく保存できません。

該当のソースコード

python

1#views.py 2class UploadView(TemplateView): 3 template_name = 'photoUpload.html' 4 fields = () 5 def get_context_data(self, **kwargs): 6 context = super(UploadView, self).get_context_data(**kwargs) 7 context.update({ 8 'one_for_one':forms.TopicForm(), 9 'multi_for_one':forms.TopicImageForm() 10 }) 11 return context 12 def post(self, request, *args, **kwargs): 13 form_main = TopicForm(request.POST) 14 main_PK = None 15 if form_main.is_valid(): 16 post_main = form_main.save(commit=False) 17 post_main.title = "変更成功" 18 post_main.save() 19 main_PK = post_main.id #上で保存したレコードのid値を取得 20 req_copy = request.POST.copy() 21 sub_dict = {} 22 sub_dict['csrfmiddlewaretoken'] = req_copy['csrfmiddlewaretoken'] 23 sub_dict['topic'] = main_PK 24 photo_list = [] 25 photo_list = request.FILES.getlist('image1') 26 for photo in photo_list: 27 sub_dict['image1'] = photo 28 form_photo = TopicImageForm() 29 if form_photo.is_valid(): 30 post_photo = form_photo.save(commit=False) 31 post_photo.save() 32 return render(request,'photoUpload.html')

python

1#forms.py 2class TopicForm(forms.ModelForm): 3 4 class Meta: 5 model = PhotoPost 6 fields = ["title","category"] 7#上記のfieldsに全てのカラムを設定する場合は'__all__'とする。 8 9class TopicImageForm(forms.ModelForm): 10 image1 =forms.ImageField(label="galaryの画像", 11 widget=forms.ClearableFileInput(attrs={'multiple':True})) 12 class Meta: 13 model = PhotoOnlyPost 14 fields = ["topic","image1"]

python

1#models.py 2class PhotoPost(models.Model): 3 CATEGORY = (('LEGEND FC','legend'),('SCHOOL','school')) 4 title = models.CharField( 5 verbose_name='タイトル', 6 max_length=200, 7 blank = True, 8 null =True 9 ) 10 category = models.CharField( 11 verbose_name = 'カテゴリ', 12 max_length=50, 13 choices=CATEGORY 14 ) 15 posted_at = models.DateTimeField( 16 verbose_name='投稿日時', 17 auto_now_add=True 18 ) 19 def images(self): 20 return PhotoOnlyPost.objects.filter(topic=self.id) 21 22 def __str__(self): 23 return self.title 24 25class PhotoOnlyPost(models.Model): 26 topic = models.ForeignKey(PhotoPost, 27 verbose_name="トピック", 28 on_delete=models.CASCADE) 29 30 image1 = models.ImageField( 31 verbose_name='イメージ画像1', 32 upload_to = 'photo2' 33 ) 34 def __str__(self): 35 return self.topic.title

html

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width,initial-scale=1"> 6 <title>簡易掲示板</title> 7 <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous"> 8 <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script> 9</head> 10 11<body> 12 13 <main class="container"> 14 <form action="" method="POST" name="uploadPhoto" id="uploadPhoto" enctype="multipart/form-data"> 15 {% csrf_token %} 16 {{one_for_one.non_field_errors }} 17 {{multi_for_one.non_field_errors }} 18 {{one_for_one.as_p}} 19 {{multi_for_one.image1}} 20 <button type="submit" class="btn btn-primary" name="save_photo"> 変更 </button> 21 </form> 22 </main> 23</body> 24</html>

試したこと

現在のコード以外は特に試していませんが、ファイルがデータとしてではなく、
リストが文字列として扱われているのかな?と思っているのでその方向性で色々と探ています。

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

[2023/01/30]
enctype="multipart/form-data"をhtmlへ追加したことによりrequest.FILESへ複数のファイルが下記のように
postされました。
<MultiValueDict: {'image1': [<InMemoryUploadedFile: テスト.jpg (image/jpeg)>, <InMemoryUploadedFile: テスト1.jpg (image/jpeg)>, <InMemoryUploadedFile:テスト2.jpg (image/jpeg)>]}>

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Django

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

アップロード

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