質問編集履歴
1
回答がなかなかありませんので質問を大幅に編集いたします。
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
<python django>コメント投稿フォーム
|
1
|
+
<python django>コメント投稿フォームをclassの継承を使って表示したい
|
test
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
djangoチュートリアルの投票アプリにコメント投稿フォームを加えたいです。
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
### 前提・実現したいこと
|
6
|
+
|
1
7
|
python=3.7.0
|
2
8
|
|
3
9
|
django=(2, 0, 2, 'final', 0)
|
@@ -8,7 +14,7 @@
|
|
8
14
|
|
9
15
|
|
10
16
|
|
11
|
-
この投票ページの直下にコメントフォームを置こうとしています
|
17
|
+
この投票ページの直下にコメントフォームを置こうとしています。投票時にユーザーになぜその選択肢を選んだかコメントをもらいたいのです。しかし実際にはコードを書いても表示がされません。
|
12
18
|
|
13
19
|
![イメージ説明](a6fcd183dc1d7a231bbd4eeece95b30b.png)
|
14
20
|
|
@@ -16,11 +22,109 @@
|
|
16
22
|
|
17
23
|
|
18
24
|
|
25
|
+
### classの継承を試しました。
|
26
|
+
|
27
|
+
上記画像のhtmlコードは
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
```html
|
32
|
+
|
33
|
+
<h1>{{ question.question_text }}</h1>
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
<form action="{% url 'polls:vote' question.id %}" method="post">
|
42
|
+
|
43
|
+
{% csrf_token %}
|
44
|
+
|
45
|
+
{% for choice in question.choice_set.all %}
|
46
|
+
|
47
|
+
<input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}">
|
48
|
+
|
49
|
+
<label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br>
|
50
|
+
|
19
|
-
|
51
|
+
{% endfor %}
|
20
|
-
|
21
|
-
|
22
|
-
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
|
23
|
-
```
|
57
|
+
```
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
urls.pyでclass DetailViewを呼び込んだため、detail.htmlにDetailViewの内容がhtmlに反映されています。(DetailViewの内容は本筋と関係ないと思ったため省略します。必要なら適宜記載します。)
|
62
|
+
|
63
|
+
```python
|
64
|
+
|
65
|
+
path('<int:pk>/', views.DetailView.as_view(), name='detail'),
|
66
|
+
|
67
|
+
```
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
ここからさらにフォームをhtmlに加えるためviews.pyでclassの継承を使いました。
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
views.py
|
78
|
+
|
79
|
+
```python
|
80
|
+
|
81
|
+
class CommentView(DetailView):
|
82
|
+
|
83
|
+
def add(request):
|
84
|
+
|
85
|
+
context = {
|
86
|
+
|
87
|
+
'form':CommentForm()
|
88
|
+
|
89
|
+
}
|
90
|
+
|
91
|
+
return render(request, 'polls/detail.html', context)
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
```
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
さらにurls.pyも
|
100
|
+
|
101
|
+
```python
|
102
|
+
|
103
|
+
path('<int:pk>/', views.CommentView.as_view(), name='detail'),
|
104
|
+
|
105
|
+
```
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
に変更しました。
|
110
|
+
|
111
|
+
しかしこれでも表示は
|
112
|
+
|
113
|
+
![イメージ説明](a6fcd183dc1d7a231bbd4eeece95b30b.png)
|
114
|
+
|
115
|
+
のまま変化しません。
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
|
120
|
+
|
121
|
+
### そのほかの情報について
|
122
|
+
|
123
|
+
フォームを作るにあたってモデルを作る必要がありますのでmodels.pyに
|
124
|
+
|
125
|
+
|
126
|
+
|
127
|
+
```python
|
24
128
|
|
25
129
|
class Comment(models.Model):
|
26
130
|
|
@@ -30,11 +134,13 @@
|
|
30
134
|
|
31
135
|
|
32
136
|
|
137
|
+
|
138
|
+
|
139
|
+
comment_question = models.ForeignKey(Question, on_delete=models.CASCADE, blank=True, null=True,)
|
140
|
+
|
33
|
-
|
141
|
+
text_area = models.TextField('感想', blank=True)
|
34
|
-
|
35
|
-
|
142
|
+
|
36
|
-
|
37
|
-
|
143
|
+
|
38
144
|
|
39
145
|
|
40
146
|
|
@@ -50,17 +156,23 @@
|
|
50
156
|
|
51
157
|
|
52
158
|
|
53
|
-
|
159
|
+
これをフォーム形式に変換しなければなりませんので。
|
54
|
-
|
160
|
+
|
55
|
-
|
161
|
+
forms.pyにclass Commentを受渡しました。
|
56
|
-
|
162
|
+
|
163
|
+
|
164
|
+
|
165
|
+
|
166
|
+
|
57
|
-
```
|
167
|
+
```python
|
168
|
+
|
169
|
+
|
58
170
|
|
59
171
|
from django import forms
|
60
172
|
|
61
173
|
|
62
174
|
|
63
|
-
from polls.models import Comment
|
175
|
+
from polls.models import Choice, Comment
|
64
176
|
|
65
177
|
|
66
178
|
|
@@ -74,158 +186,36 @@
|
|
74
186
|
|
75
187
|
model = Comment
|
76
188
|
|
77
|
-
fields = ('
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
```
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
f
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
form.save()
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
else:
|
116
|
-
|
117
|
-
form = CommentForm()
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
```
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
detail.htmlはこのようになっています。
|
128
|
-
|
129
|
-
```
|
130
|
-
|
131
|
-
<h1>{{ question.question_text }}</h1>
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
<form action="{% url 'polls:vote' question.id %}" method="post">
|
140
|
-
|
141
|
-
{% csrf_token %}
|
142
|
-
|
143
|
-
{% for choice in question.choice_set.all %}
|
144
|
-
|
145
|
-
<input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}">
|
146
|
-
|
147
|
-
<label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br>
|
148
|
-
|
149
|
-
{% endfor %}
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
↓ここから下が今回質問しているフォーム部分です
|
158
|
-
|
159
|
-
<input type="submit" value="投票">
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
</form>
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
<form action="/" method="post">
|
168
|
-
|
169
|
-
{% csrf_token %}
|
170
|
-
|
171
|
-
<h3>感想をどうぞ</h3>
|
172
|
-
|
173
|
-
{{ form.as_p }}
|
174
|
-
|
175
|
-
<input type="submit" value="送信">
|
176
|
-
|
177
|
-
</form>
|
178
|
-
|
179
|
-
```
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
該当するurlsは
|
186
|
-
|
187
|
-
```
|
188
|
-
|
189
|
-
from django.urls import path
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
from . import views
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
app_name = 'polls'
|
198
|
-
|
199
|
-
urlpatterns = [
|
200
|
-
|
201
|
-
path('', views.IndexView.as_view(), name='index'),
|
202
|
-
|
203
|
-
path('<int:pk>/', views.DetailView.as_view(), name='detail'),
|
204
|
-
|
205
|
-
path('<int:pk>/results/', views.ResultsView.as_view(), name='results'),
|
206
|
-
|
207
|
-
path('<int:question_id>/vote/', views.vote, name='vote'),
|
208
|
-
|
209
|
-
]
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
```
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
の
|
218
|
-
|
219
|
-
```
|
220
|
-
|
221
|
-
path('<int:pk>/', views.DetailView.as_view(), name='detail'),
|
222
|
-
|
223
|
-
```
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
です。なにか少しずつずれがあり表示されていないのだと思うのですが・・・。
|
230
|
-
|
231
|
-
よろしくお願いいたします!
|
189
|
+
fields = ('text_area',)
|
190
|
+
|
191
|
+
|
192
|
+
|
193
|
+
```
|
194
|
+
|
195
|
+
|
196
|
+
|
197
|
+
なおdjangoチュートリアルの投票機能を基にコメント部分を改造しています。
|
198
|
+
|
199
|
+
[https://docs.djangoproject.com/ja/2.1/intro/tutorial01/](https://docs.djangoproject.com/ja/2.1/intro/tutorial01/)
|
200
|
+
|
201
|
+
|
202
|
+
|
203
|
+
[https://github.com/sr2460/polls](https://github.com/sr2460/polls)
|
204
|
+
|
205
|
+
|
206
|
+
|
207
|
+
ディレクトリ構成はこのようになっております。
|
208
|
+
|
209
|
+
![イメージ説明](745f16e5a6686a70ebeaab58b2e9d3f7.png)
|
210
|
+
|
211
|
+
|
212
|
+
|
213
|
+
|
214
|
+
|
215
|
+
classの継承以外にも何か方法があればその方法でも構いません。
|
216
|
+
|
217
|
+
現在エラーメッセージも出ませんし、フォームが動作するかチェックしようにもフォーム自体が表示されませんので困り果てております。
|
218
|
+
|
219
|
+
まずフォームをきちんとこのページに表示させたいです。
|
220
|
+
|
221
|
+
どうかアドバイスよろしくお願いいたします。
|