質問編集履歴

1

2022/01/14 05:35

投稿

etcetera
etcetera

スコア24

test CHANGED
@@ -1 +1 @@
1
- django form情報をsession一時的に保存して再度postるときに画像ファイルをpostすることができない。
1
+ django fileを含むform情報を正常すことができない。
test CHANGED
@@ -1,203 +1,110 @@
1
1
  データ入力ページでformにデータを入力している最中に別のページに移動する必要があるため、formデータをsessionに保存しておいて、再度データ入力ページに戻ってきたときにsessionからformデータを取得するようにしたいと思っています。
2
-
3
2
  しかし、再度入力ページに戻ってきたときのpostがうまくいきません。(request.FILESが空で帰ってくる)
4
3
 
5
-
6
-
7
4
  一回目のpost(別ページ遷移時)のrequest.FILESの中身
8
-
9
5
  <MultiValueDict: {'snsImage': [<InMemoryUploadedFile: helmet_cap.png (image/png)>]}>
10
6
 
11
-
12
-
13
7
  session情報から復元したデータ
14
-
15
8
  <MultiValueDict: {'snsImage': [<SimpleUploadedFile: ika.png (image/png)>]}>
16
9
 
17
-
18
-
19
10
  二回目のpost時のrequest.FILESの中身
20
-
21
11
  <MultiValueDict: {}>
22
-
23
-
24
12
 
25
13
  views.py(一部省略)
26
14
 
27
-
28
-
29
15
  ```views.py
30
-
31
16
  if request.method == "POST":
32
-
33
17
     if request.POST.get('Select'): #別のページに移動したとき
34
-
35
18
  if request.FILES:
36
-
37
19
  data_bytes = request.FILES['snsImage'].read()
38
-
39
20
  data_encode_bytes = base64.b64encode(data_bytes)
40
-
41
21
  data_encode_str = data_encode_bytes.decode('utf-8')
42
-
43
22
  file_data_dict={
44
-
45
23
  'data':data_encode_str,
46
-
47
24
  'filename':request.FILES['snsImage'].name,
48
-
49
25
  'content_type':request.FILES['snsImage'].content_type
50
-
51
26
  }
52
-
53
27
  request.session['form-file']=file_data_dict
54
-
55
28
  request.session['form-data']=request.POST
56
-
57
29
  return JsonResponse({})
58
-
59
30
  else:
60
-
61
31
  if 'form-file' in request.session:
62
-
63
32
  file_data_dict=request.session.get('form-file')
64
-
65
33
  img_bytes=base64.b64decode(file_data_dict['data'])
66
-
67
34
  uploadedFile = SimpleUploadedFile(file_data_dict['filename'], img_bytes,file_data_dict['content_type'])
68
-
69
35
  files = {'snsImage': [uploadedFile] }
70
-
71
36
  res=MultiValueDict(files)
72
-
73
37
  form = TweetCreationForm(request.session.get('form-data'),res)
74
-
75
38
  return render(request,'tweet.html',{'form':form})
76
-
77
39
  ```
78
40
 
79
41
 
80
-
81
-
82
-
83
42
  ```html
84
-
85
43
  <form method="POST" action="{% url 'tweet' %}" enctype="multipart/form-data" id="TweetForm">{% csrf_token %}
86
-
87
44
  省略
88
-
89
45
  <a href="{% url 'SearchItem' 'Select' %}" class="btn btn-lg btn-success" role="button" id="select-button">本を選択する</a>
90
-
91
46
  省略
92
-
93
47
  <div class="hooter-container d-flex">
94
-
95
48
  <label for="id_snsImage" class="image-label">画像を選択{{ form.snsImage }}</label>
96
-
97
49
  <button class="btn btn-lg btn-success" type="submit">投稿</button>
98
-
99
50
  </div>
100
-
101
51
  </form>
52
+ ```
53
+ ```javasctipt
54
+ $(document).ready(function(event){ //別のページに移動するボタンを押すとformDataとしてpostする
55
+ $(document).on('click', '#select-button', function(event){
56
+ const xhr = new XMLHttpRequest();
57
+ xhr.open('post', "{% url 'tweet' %}");
58
+ var form=document.getElementById('TweetForm')
59
+ var formData=new FormData(form);
60
+ formData.append('Select',true);
61
+ xhr.send(formData);
62
+ });
63
+ });
64
+ ```
65
+ models.py
66
+ ```ここに言語を入力
67
+ class TweetModel(models.Model):
68
+ title=models.CharField(max_length=70,blank=True)
69
+ content=models.TextField(blank=True)
70
+ user=models.ForeignKey(CustomUser,verbose_name='紐づくユーザー',on_delete=models.CASCADE,blank=True)
71
+ rating=models.IntegerField(blank=True)
72
+ snsImage=models.ImageField(null=True,blank=True,upload_to='')
73
+ ISBNcode=models.CharField(max_length=30,blank=True)
102
74
 
103
75
  ```
76
+ forms.py
77
+ ```ここに言語を入力
78
+ class TweetCreationForm(forms.ModelForm):
104
79
 
80
+ def __init__(self, *args, **kwargs):
81
+ super(TweetCreationForm, self).__init__(*args, **kwargs)
82
+ self.fields['title'].widget.attrs.update({'class' : 'form-control','placeholder':'タイトル','autofocus' : 'autofocus'})
83
+ self.fields['content'].widget.attrs.update({'class' : 'form-control','placeholder':'感想を書こう!'})
105
- ```javasctipt
84
+ for field in self.fields:
85
+ self.fields[field].required= False
106
86
 
87
+ Choice=(
88
+ (0,'評価'),(1,1),(2,2),(3,3),(4,4),(5,5),
89
+ )
107
- $(document).ready(function(event){ //別のページに移動するボタンを押すとformDataとしてpostする
90
+ rating=forms.ChoiceField(choices=Choice,required=True)
108
91
 
92
+ class Meta:
93
+ model = TweetModel
109
- $(document).on('click', '#select-button', function(event){
94
+ fields = '__all__'
110
95
 
111
- const xhr = new XMLHttpRequest();
112
-
113
- xhr.open('post', "{% url 'tweet' %}");
114
-
115
- var form=document.getElementById('TweetForm')
116
-
117
- var formData=new FormData(form);
96
+ labels = {
118
-
119
- formData.append('Select',true);
97
+ 'content':"本文",
120
-
121
- xhr.send(formData);
98
+ 'snsImage':"画像",
122
-
123
- });
99
+ }
124
-
125
- });
126
100
 
127
101
  ```
102
+ djangoのドキュメントを見て、uploadfileの扱いや、formの引数に入れるデータの型を調べましたが、どこが原因なのか見当がつきません。よろしくお願いします。
128
103
 
129
- models.py
104
+ 追記
105
+ views.py において下記を実行すると、画像データを取得できたので、htmlに渡す際に不具合が起きているのだと思われます。
130
106
 
107
+ form = TweetCreationForm(request.session.get('form-data'),res)
108
+ obj=form.save(commit=False)
131
- ```ここに言語を入力
109
+ print(obj.snsImage)
132
110
 
133
- class TweetModel(models.Model):
134
-
135
- title=models.CharField(max_length=70,blank=True)
136
-
137
- content=models.TextField(blank=True)
138
-
139
- user=models.ForeignKey(CustomUser,verbose_name='紐づくユーザー',on_delete=models.CASCADE,blank=True)
140
-
141
- rating=models.IntegerField(blank=True)
142
-
143
- snsImage=models.ImageField(null=True,blank=True,upload_to='')
144
-
145
- ISBNcode=models.CharField(max_length=30,blank=True)
146
-
147
-
148
-
149
- ```
150
-
151
- forms.py
152
-
153
- ```ここに言語を入力
154
-
155
- class TweetCreationForm(forms.ModelForm):
156
-
157
-
158
-
159
- def __init__(self, *args, **kwargs):
160
-
161
- super(TweetCreationForm, self).__init__(*args, **kwargs)
162
-
163
- self.fields['title'].widget.attrs.update({'class' : 'form-control','placeholder':'タイトル','autofocus' : 'autofocus'})
164
-
165
- self.fields['content'].widget.attrs.update({'class' : 'form-control','placeholder':'感想を書こう!'})
166
-
167
- for field in self.fields:
168
-
169
- self.fields[field].required= False
170
-
171
-
172
-
173
- Choice=(
174
-
175
- (0,'評価'),(1,1),(2,2),(3,3),(4,4),(5,5),
176
-
177
- )
178
-
179
- rating=forms.ChoiceField(choices=Choice,required=True)
180
-
181
-
182
-
183
- class Meta:
184
-
185
- model = TweetModel
186
-
187
- fields = '__all__'
188
-
189
-
190
-
191
- labels = {
192
-
193
- 'content':"本文",
194
-
195
- 'snsImage':"画像",
196
-
197
- }
198
-
199
-
200
-
201
- ```
202
-
203
- djangoのドキュメントを見て、uploadfileの扱いや、formの引数に入れるデータの型を調べましたが、どこが原因なのか見当がつきません。よろしくお願いします。