質問編集履歴
1
回答がなかなかありませんので質問を大幅に編集いたします。
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
<python django>コメント投稿フォーム
|
1
|
+
<python django>コメント投稿フォームをclassの継承を使って表示したい
|
body
CHANGED
@@ -1,116 +1,111 @@
|
|
1
|
+
djangoチュートリアルの投票アプリにコメント投稿フォームを加えたいです。
|
2
|
+
|
3
|
+
### 前提・実現したいこと
|
1
4
|
python=3.7.0
|
2
5
|
django=(2, 0, 2, 'final', 0)
|
3
6
|
|
4
7
|
の環境で開発しています。
|
5
8
|
|
6
|
-
この投票ページの直下にコメントフォームを置こうとしています
|
9
|
+
この投票ページの直下にコメントフォームを置こうとしています。投票時にユーザーになぜその選択肢を選んだかコメントをもらいたいのです。しかし実際にはコードを書いても表示がされません。
|
7
10
|

|
8
11
|
|
9
12
|
|
10
|
-
|
13
|
+
### classの継承を試しました。
|
14
|
+
上記画像のhtmlコードは
|
11
15
|
|
12
|
-
```
|
16
|
+
```html
|
13
|
-
|
17
|
+
<h1>{{ question.question_text }}</h1>
|
14
18
|
|
15
|
-
|
19
|
+
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
|
16
20
|
|
21
|
+
<form action="{% url 'polls:vote' question.id %}" method="post">
|
22
|
+
{% csrf_token %}
|
17
|
-
|
23
|
+
{% for choice in question.choice_set.all %}
|
24
|
+
<input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}">
|
18
|
-
|
25
|
+
<label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br>
|
19
|
-
|
26
|
+
{% endfor %}
|
20
27
|
|
21
|
-
class Meta:
|
22
|
-
db_table = 'comment'
|
23
|
-
verbose_name = verbose_name_plural = 'メッセージ'
|
24
28
|
|
25
29
|
```
|
26
30
|
|
27
|
-
|
31
|
+
urls.pyでclass DetailViewを呼び込んだため、detail.htmlにDetailViewの内容がhtmlに反映されています。(DetailViewの内容は本筋と関係ないと思ったため省略します。必要なら適宜記載します。)
|
28
|
-
|
32
|
+
```python
|
33
|
+
path('<int:pk>/', views.DetailView.as_view(), name='detail'),
|
29
34
|
```
|
30
|
-
from django import forms
|
31
35
|
|
32
|
-
from polls.models import Comment
|
33
36
|
|
37
|
+
ここからさらにフォームをhtmlに加えるためviews.pyでclassの継承を使いました。
|
34
38
|
|
39
|
+
views.py
|
40
|
+
```python
|
35
|
-
class
|
41
|
+
class CommentView(DetailView):
|
42
|
+
def add(request):
|
43
|
+
context = {
|
44
|
+
'form':CommentForm()
|
45
|
+
}
|
46
|
+
return render(request, 'polls/detail.html', context)
|
36
47
|
|
37
|
-
|
48
|
+
```
|
38
|
-
model = Comment
|
39
|
-
fields = ('message',)
|
40
49
|
|
50
|
+
さらにurls.pyも
|
51
|
+
```python
|
52
|
+
path('<int:pk>/', views.CommentView.as_view(), name='detail'),
|
41
53
|
```
|
42
54
|
|
43
|
-
|
55
|
+
に変更しました。
|
56
|
+
しかしこれでも表示は
|
57
|
+

|
58
|
+
のまま変化しません。
|
44
59
|
|
45
|
-
```
|
46
|
-
from polls.forms import CommentForm
|
47
60
|
|
61
|
+
### そのほかの情報について
|
62
|
+
フォームを作るにあたってモデルを作る必要がありますのでmodels.pyに
|
48
63
|
|
64
|
+
```python
|
49
|
-
|
65
|
+
class Comment(models.Model):
|
50
66
|
|
51
|
-
def index(request):
|
52
|
-
"""
|
67
|
+
"""感想."""
|
53
|
-
if request.method == 'POST':
|
54
|
-
form = CommentForm(request.POST)
|
55
|
-
if form.is_valid():
|
56
|
-
form.save()
|
57
68
|
|
69
|
+
|
58
|
-
|
70
|
+
comment_question = models.ForeignKey(Question, on_delete=models.CASCADE, blank=True, null=True,)
|
59
|
-
|
71
|
+
text_area = models.TextField('感想', blank=True)
|
72
|
+
|
60
73
|
|
61
|
-
|
74
|
+
class Meta:
|
75
|
+
db_table = 'comment'
|
76
|
+
verbose_name = verbose_name_plural = 'メッセージ'
|
62
77
|
|
63
|
-
|
64
|
-
detail.htmlはこのようになっています。
|
65
78
|
```
|
66
|
-
<h1>{{ question.question_text }}</h1>
|
67
79
|
|
80
|
+
これをフォーム形式に変換しなければなりませんので。
|
68
|
-
|
81
|
+
forms.pyにclass Commentを受渡しました。
|
69
82
|
|
70
|
-
<form action="{% url 'polls:vote' question.id %}" method="post">
|
71
|
-
{% csrf_token %}
|
72
|
-
{% for choice in question.choice_set.all %}
|
73
|
-
<input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}">
|
74
|
-
<label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br>
|
75
|
-
{% endfor %}
|
76
83
|
|
84
|
+
```python
|
77
85
|
|
86
|
+
from django import forms
|
78
87
|
|
79
|
-
↓ここから下が今回質問しているフォーム部分です
|
80
|
-
|
88
|
+
from polls.models import Choice, Comment
|
81
89
|
|
82
|
-
</form>
|
83
90
|
|
84
|
-
<form action="/" method="post">
|
85
|
-
{% csrf_token %}
|
86
|
-
|
91
|
+
class CommentForm(forms.ModelForm):
|
87
|
-
{{ form.as_p }}
|
88
|
-
<input type="submit" value="送信">
|
89
|
-
</form>
|
90
|
-
```
|
91
92
|
|
93
|
+
class Meta:
|
94
|
+
model = Comment
|
95
|
+
fields = ('text_area',)
|
92
96
|
|
93
|
-
該当するurlsは
|
94
97
|
```
|
95
|
-
from django.urls import path
|
96
98
|
|
97
|
-
|
99
|
+
なおdjangoチュートリアルの投票機能を基にコメント部分を改造しています。
|
100
|
+
[https://docs.djangoproject.com/ja/2.1/intro/tutorial01/](https://docs.djangoproject.com/ja/2.1/intro/tutorial01/)
|
98
101
|
|
99
|
-
app_name = 'polls'
|
100
|
-
urlpatterns = [
|
101
|
-
path('', views.IndexView.as_view(), name='index'),
|
102
|
-
path('<int:pk>/', views.DetailView.as_view(), name='detail'),
|
103
|
-
path('<int:pk>/results/', views.ResultsView.as_view(), name='results'),
|
104
|
-
|
102
|
+
[https://github.com/sr2460/polls](https://github.com/sr2460/polls)
|
105
|
-
]
|
106
103
|
|
107
|
-
|
104
|
+
ディレクトリ構成はこのようになっております。
|
105
|
+

|
108
106
|
|
109
|
-
の
|
110
|
-
```
|
111
|
-
path('<int:pk>/', views.DetailView.as_view(), name='detail'),
|
112
|
-
```
|
113
107
|
|
114
|
-
|
115
|
-
|
108
|
+
classの継承以外にも何か方法があればその方法でも構いません。
|
109
|
+
現在エラーメッセージも出ませんし、フォームが動作するかチェックしようにもフォーム自体が表示されませんので困り果てております。
|
110
|
+
まずフォームをきちんとこのページに表示させたいです。
|
116
|
-
よろしくお願いいたします
|
111
|
+
どうかアドバイスよろしくお願いいたします。
|