回答編集履歴

2

リロード

2020/07/07 11:23

投稿

YufanLou
YufanLou

スコア464

test CHANGED
@@ -15,3 +15,93 @@
15
15
 
16
16
 
17
17
  追記:問題文のコードは`check.html`で`index.html`を書き換えたので、上記のJavaScriptを`check.html`に入れてください。
18
+
19
+
20
+
21
+ リロードについて追記:
22
+
23
+
24
+
25
+ /poll/check でリロードで form データ再送するのを実装します。
26
+
27
+ まず、どこかで form データを保存しなければならない。History API で歴史 state に form データを保存できます。
28
+
29
+
30
+
31
+ ```javascript
32
+
33
+ // app.js
34
+
35
+ // ...
36
+
37
+ async function sendDataOnLoad() {
38
+
39
+ //歴史state存在しなかったら中止
40
+
41
+ if (!history.state) return;
42
+
43
+ //歴史stateからformデータを取得
44
+
45
+ let formData = history.state.formData;
46
+
47
+ let response = await fetch(formUrl, {
48
+
49
+ method: 'POST',
50
+
51
+ body: formData
52
+
53
+ });
54
+
55
+ if(response.ok){
56
+
57
+ //成功の場合の処理
58
+
59
+ console.log(response)
60
+
61
+ document.open();
62
+
63
+ document.write(await response.text());
64
+
65
+ document.close();
66
+
67
+ }else{
68
+
69
+ //失敗の場合の処理
70
+
71
+ }
72
+
73
+ }
74
+
75
+ window.onload = sendDataOnLoad;
76
+
77
+ ```
78
+
79
+
80
+
81
+ サーバーサイドでリダイレクトしたらこのコードを動作しなくなるかもしれないので、Pythonをこう変わります:
82
+
83
+
84
+
85
+ ```python
86
+
87
+ // views.py
88
+
89
+ def check(request):
90
+
91
+
92
+
93
+ if request.method == "GET":
94
+
95
+ return render(request, 'polls/index.html')
96
+
97
+ # ...
98
+
99
+ ```
100
+
101
+
102
+
103
+ けど、直接にこう実装したら、formデータを送信して、/polls/checkをロードして、formデータを送信して、/polls/checkをロードして…という無限ループになりそうです。
104
+
105
+
106
+
107
+ 未完成ですが、参考になれたら幸いです。

1

コメントからどのページに入れるかを追記

2020/07/07 11:23

投稿

YufanLou
YufanLou

スコア464

test CHANGED
@@ -11,3 +11,7 @@
11
11
  }
12
12
 
13
13
  ```
14
+
15
+
16
+
17
+ 追記:問題文のコードは`check.html`で`index.html`を書き換えたので、上記のJavaScriptを`check.html`に入れてください。