データ入力ページで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)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。