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

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

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

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

Q&A

解決済

1回答

1094閲覧

django fileを含むform情報を正常に渡すことができない。

etcetera

総合スコア24

Django

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

0グッド

0クリップ

投稿2022/01/11 07:35

編集2022/01/14 05:35

データ入力ページでformにデータを入力している最中に別のページに移動する必要があるため、formデータをsessionに保存しておいて、再度データ入力ページに戻ってきたときにsessionからformデータを取得するようにしたいと思っています。
しかし、再度入力ページに戻ってきたときのpostがうまくいきません。(request.FILESが空で帰ってくる)

一回目のpost(別ページ遷移時)のrequest.FILESの中身
<MultiValueDict: {'snsImage': [<InMemoryUploadedFile: helmet_cap.png (image/png)>]}>

session情報から復元したデータ
<MultiValueDict: {'snsImage': [<SimpleUploadedFile: ika.png (image/png)>]}>

二回目のpost時のrequest.FILESの中身
<MultiValueDict: {}>

views.py(一部省略)

views.py

1if request.method == "POST": 2   if request.POST.get('Select'): #別のページに移動したとき 3 if request.FILES: 4 data_bytes = request.FILES['snsImage'].read() 5 data_encode_bytes = base64.b64encode(data_bytes) 6 data_encode_str = data_encode_bytes.decode('utf-8') 7 file_data_dict={ 8 'data':data_encode_str, 9 'filename':request.FILES['snsImage'].name, 10 'content_type':request.FILES['snsImage'].content_type 11 } 12 request.session['form-file']=file_data_dict 13 request.session['form-data']=request.POST 14 return JsonResponse({}) 15else: 16 if 'form-file' in request.session: 17 file_data_dict=request.session.get('form-file') 18 img_bytes=base64.b64decode(file_data_dict['data']) 19 uploadedFile = SimpleUploadedFile(file_data_dict['filename'], img_bytes,file_data_dict['content_type']) 20 files = {'snsImage': [uploadedFile] } 21 res=MultiValueDict(files) 22 form = TweetCreationForm(request.session.get('form-data'),res) 23 return render(request,'tweet.html',{'form':form})

html

1<form method="POST" action="{% url 'tweet' %}" enctype="multipart/form-data" id="TweetForm">{% csrf_token %} 2 省略 3 <a href="{% url 'SearchItem' 'Select' %}" class="btn btn-lg btn-success" role="button" id="select-button">本を選択する</a> 4 省略 5 <div class="hooter-container d-flex"> 6 <label for="id_snsImage" class="image-label">画像を選択{{ form.snsImage }}</label> 7 <button class="btn btn-lg btn-success" type="submit">投稿</button> 8 </div> 9 </form>

javasctipt

1$(document).ready(function(event){ //別のページに移動するボタンを押すとformDataとしてpostする 2 $(document).on('click', '#select-button', function(event){ 3 const xhr = new XMLHttpRequest(); 4 xhr.open('post', "{% url 'tweet' %}"); 5 var form=document.getElementById('TweetForm') 6 var formData=new FormData(form); 7 formData.append('Select',true); 8 xhr.send(formData); 9 }); 10 });

models.py

class TweetModel(models.Model): title=models.CharField(max_length=70,blank=True) content=models.TextField(blank=True) user=models.ForeignKey(CustomUser,verbose_name='紐づくユーザー',on_delete=models.CASCADE,blank=True) rating=models.IntegerField(blank=True) snsImage=models.ImageField(null=True,blank=True,upload_to='') ISBNcode=models.CharField(max_length=30,blank=True)

forms.py

class TweetCreationForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(TweetCreationForm, self).__init__(*args, **kwargs) self.fields['title'].widget.attrs.update({'class' : 'form-control','placeholder':'タイトル','autofocus' : 'autofocus'}) self.fields['content'].widget.attrs.update({'class' : 'form-control','placeholder':'感想を書こう!'}) for field in self.fields: self.fields[field].required= False Choice=( (0,'評価'),(1,1),(2,2),(3,3),(4,4),(5,5), ) rating=forms.ChoiceField(choices=Choice,required=True) class Meta: model = TweetModel fields = '__all__' labels = { 'content':"本文", 'snsImage':"画像", }

djangoのドキュメントを見て、uploadfileの扱いや、formの引数に入れるデータの型を調べましたが、どこが原因なのか見当がつきません。よろしくお願いします。

追記
views.py において下記を実行すると、画像データを取得できたので、htmlに渡す際に不具合が起きているのだと思われます。

form = TweetCreationForm(request.session.get('form-data'),res)
obj=form.save(commit=False)
print(obj.snsImage)

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

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

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

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

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

guest

回答1

0

自己解決

別の方法で実装しました。

投稿2022/01/15 10:34

etcetera

総合スコア24

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問