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

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

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

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

解決済

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

etcetera
etcetera

総合スコア23

Django

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

1回答

0評価

0クリップ

147閲覧

投稿2022/01/11 07:35

編集2022/01/15 19:34

データ入力ページで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

if request.method == "POST":    if request.POST.get('Select'): #別のページに移動したとき if request.FILES: data_bytes = request.FILES['snsImage'].read() data_encode_bytes = base64.b64encode(data_bytes) data_encode_str = data_encode_bytes.decode('utf-8') file_data_dict={ 'data':data_encode_str, 'filename':request.FILES['snsImage'].name, 'content_type':request.FILES['snsImage'].content_type } request.session['form-file']=file_data_dict request.session['form-data']=request.POST return JsonResponse({}) else: if 'form-file' in request.session: file_data_dict=request.session.get('form-file') img_bytes=base64.b64decode(file_data_dict['data']) uploadedFile = SimpleUploadedFile(file_data_dict['filename'], img_bytes,file_data_dict['content_type']) files = {'snsImage': [uploadedFile] } res=MultiValueDict(files) form = TweetCreationForm(request.session.get('form-data'),res) return render(request,'tweet.html',{'form':form})

html

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

javasctipt

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

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)

良い質問の評価を上げる

以下のような質問は評価を上げましょう

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

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

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Django

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