質問編集履歴
1
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
django form情報を
|
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
|
-
|
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
|
-
|
90
|
+
rating=forms.ChoiceField(choices=Choice,required=True)
|
108
91
|
|
92
|
+
class Meta:
|
93
|
+
model = TweetModel
|
109
|
-
|
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
|
-
|
96
|
+
labels = {
|
118
|
-
|
119
|
-
|
97
|
+
'content':"本文",
|
120
|
-
|
121
|
-
|
98
|
+
'snsImage':"画像",
|
122
|
-
|
123
|
-
}
|
99
|
+
}
|
124
|
-
|
125
|
-
});
|
126
100
|
|
127
101
|
```
|
102
|
+
djangoのドキュメントを見て、uploadfileの扱いや、formの引数に入れるデータの型を調べましたが、どこが原因なのか見当がつきません。よろしくお願いします。
|
128
103
|
|
129
|
-
|
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の引数に入れるデータの型を調べましたが、どこが原因なのか見当がつきません。よろしくお願いします。
|