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

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

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

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

HTML5

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

Python 3.x

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

アップロード

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

Q&A

0回答

396閲覧

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

con2319

総合スコア51

Django

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

HTML5

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

Python 3.x

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

アップロード

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

0グッド

0クリップ

投稿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)>]}>

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問