質問編集履歴

1 コードの追加

sr2460

sr2460 score 37

2018/12/08 21:01  投稿

python、djangoでプライマリーキーごとにコメントページを作りたい
### 前提・実現したいこと
python=3.7.0
django=(2, 0, 2, 'final', 0)
の環境で開発しています。
プライマリーキーごとにコメントページを作りたいと思っているのですが実際にはurlの数値が変わっても同じページに飛んでしまいます。
URLが/4/commentでフォームを送信したコメントはURLが/4/comment_listの結果ページで表示されるようにしたい。
![![イメージ説明](12c23af3ac90f0327d90615ef4561f6f.png)]
![イメージ説明](78e27440fa499c238f12fbb2c2072d02.png)
URLが/5/commentでフォームを送信したコメントはURLが/5/comment_listの結果ページで表示されるようにしたい。
![イメージ説明](2ed974527435d0810097b01bec13d71d.png)
![イメージ説明](301e1ac1f71923091a5a38a23e9336e3.png)
フォーム部分に関して。models.pyはこのようになっております。
```python
class Comment(models.Model):
   question = models.ForeignKey(Question, on_delete=models.PROTECT, default=1)
   kansou = models.TextField('コメント', blank=True, null=True)
```
forms.pyは
```python
class CommentForm(forms.ModelForm):
   class Meta:
       model = Comment
       fields ="__all__"
```
本来はfields =('kansou',)としなくてはならないのですが現在は試行錯誤の段階のためallにしております。
```python
def commentview(request, pk):
   comment = get_object_or_404(Question, pk=pk)
   form = CommentForm(request.POST or None)
   if request.method == 'POST' and form.is_valid():
       form.save()
       return redirect('polls:comment_list', comment.pk)
   context = {
       'form': form
   }
   return render(request, 'polls/comment_form.html', context)
```
views.pyでこのように記載されております。
このようにしてフォームを動かしています。
ただ前述の通りURLが変わっても同じコメントが表示されてしまいます。
### 試したこと
実験①
views.pyをここから
```python
def commentlist(request, pk):
   comment = get_object_or_404(Question, pk=pk)
   context = {
       'comment_ichiran':Comment.objects.all(),
       }
   return render(request, 'polls/comment_list.html', context)
```
```python
def commentlist(request, pk):
   comment = get_object_or_404(Question, pk=pk)
   context = {
       'comment_ichiran':Comment.objects.filter(pk=pk),**←変更部分**
       }
   return render(request, 'polls/comment_list.html', context)
```
としましたがすべてにフィルターがかかってしまいコメントページでなにも見られなくなってしまいました。
(HTTP/1.1" 200 313)と表示されているのでエラーではありませんでした。
実験②
コメントの一覧表示ページのコードここから
```python
{% for list in comment_ichiran %}
<h2>{{ list.kansou }}</h2>
{% endfor %}
```
このように変更しました
```python
{% for list in question.comment_set.all %}←変更部分
<h2>{{ list.kansou }}</h2>
{% endfor %}
```
しかし結果は先ほどと同じでエラーは出ないもののなにも表示されません。
情報が足りなければ適宜補足いたします。
アドバイスがあればお願いいたします。
アドバイスがあればお願いいたします。
### ご指摘を受けコードを追加いたしました
これがcommentに紐づくQuestionのコードになります。
models.py
```ここに言語を入力
class Question(models.Model):
   question_text = models.CharField(max_length=200)
   pub_date = models.DateTimeField('date published')
   def was_published_recently(self):
           now = timezone.now()
           return now - datetime.timedelta(days=1) <= self.pub_date <= now
           was_published_recently.admin_order_field = 'pub_date'
           was_published_recently.boolean = True
           was_published_recently.short_description = 'Published recently?'
```
またurlに関しては<int:pk>/comment/でコメントフォームを表示し<int:pk>/comment_list/でフォームで送ったコメントの一覧に遷移するようにしています。
urls.py
```python
from django.urls import path
from . import views
app_name = 'polls'
urlpatterns = [
   path('', views.IndexView.as_view(), name='index'),
   path('<int:pk>/', views.DetailView.as_view(), name='detail'),
   path('<int:pk>/results/', views.ResultsView.as_view(), name='results'),
   path('<int:question_id>/vote/', views.vote, name='vote'),
   path('<int:pk>/comment/', views.CommentView.as_view(), name='comment'),
   path('<int:pk>/comment_list/', views.commentlist, name='comment_list'),
]
```
  • Python

    18111 questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Django

    2435 questions

    DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

  • Python 3.x

    13837 questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る