teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

回答がなかなかありませんので質問を大幅に編集いたします。

2018/12/05 03:24

投稿

sr2460
sr2460

スコア50

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
  ![イメージ説明](a6fcd183dc1d7a231bbd4eeece95b30b.png)
8
11
 
9
12
 
10
- まずmodels.py作成
13
+ ### classの継承試しました。
14
+ 上記画像のhtmlコードは
11
15
 
12
- ```
16
+ ```html
13
- class Comment(models.Model):
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
- #name = models.CharField('名前', max_length=50)
23
+ {% for choice in question.choice_set.all %}
24
+ <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}">
18
- message = models.CharField('メッセージ', max_length=200)
25
+ <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br>
19
- #created_at = models.DateTimeField(default=timezone.now)
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
- それをforms.pyに受渡し
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 CommentForm(forms.ModelForm):
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
- class Meta:
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
- views.py変更を加えました
55
+ に変更ました
56
+ しかしこれでも表示は
57
+ ![イメージ説明](a6fcd183dc1d7a231bbd4eeece95b30b.png)
58
+ のまま変化しません。
44
59
 
45
- ```
46
- from polls.forms import CommentForm
47
60
 
61
+ ### そのほかの情報について
62
+ フォームを作るにあたってモデルを作る必要がありますのでmodels.pyに
48
63
 
64
+ ```python
49
- from .models import Choice, Question, Comment
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
- else:
70
+ comment_question = models.ForeignKey(Question, on_delete=models.CASCADE, blank=True, null=True,)
59
- form = CommentForm()
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
- {% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
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
- <input type="submit" value="投票">
88
+ from polls.models import Choice, Comment
81
89
 
82
- </form>
83
90
 
84
- <form action="/" method="post">
85
- {% csrf_token %}
86
- <h3>感想をどうぞ</h3>
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
- from . import views
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
- path('<int:question_id>/vote/', views.vote, name='vote'),
102
+ [https://github.com/sr2460/polls](https://github.com/sr2460/polls)
105
- ]
106
103
 
107
- ```
104
+ ディレクトリ構成はこのようになっております。
105
+ ![イメージ説明](745f16e5a6686a70ebeaab58b2e9d3f7.png)
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
+ どうかアドバイスよろしくお願いいたします