Python Django 入門トップページ


このページは Django version 3 系の情報です.新たな version 4 系の情報はこちらからどうぞ.

Django によるコメント掲示板の開発:目次

  1. プロジェクトの作成
  2. Git でコミット
  3. Web サーバを起動しておく
  4. Config
  5. Comments アプリケーションを作る
  6. はじめてのビューを作成する
  7. モデルを作る
  8. アプリケーションを有効にする
  9. マイグレーション
  10. テストデータの設定
  11. データベースからコメント一覧を取得して表示してみよう
  12. Bootstrap の導入
  13. コメントの詳細表示
  14. urls.pyの書き方
  15. HTML のテンプレート化
  16. コメントの新規投稿
  17. コメントの編集機能を追加する
  18. さらにテンプレート化
  19. モデル,マイグレーションファイル,フォームの関連
  20. 入力内容の検証(バリデーション)
  21. コメントを削除する
  22. 一覧を逆順にする
  23. ページネーション
  24. フラッシュメッセージ
  25. Static コンテンツの設置
  26. 更新や削除にもフラッシュメッセージを表示
  27. テストの自動化を実現しよう
  28. デバッグツールバーを使う
  29. generic モジュールを使わずにコメント一覧を取得する
  30. コメント一覧のページネーション
  31. 一覧の表示順序を制御する
  32. generic モジュールを使わずにコメントの詳細を表示する
  33. コメント詳細にページ送り機能を作成する
  34. generic モジュールを使わずにコメント登録機能を作成する
  35. generic モジュールを使わずにコメント編集機能を作成する
  36. generic モジュールを使わずにコメント削除機能を作成する

Django によるコメント掲示板の開発

generic モジュールを使わずにコメントの詳細を表示する

ここでは一覧表示で行ったときと同じように,generic モジュールを使わずにコメントの詳細をデータベースから取得して表示する方法を説明します.

まず,views.py にある ShowCommentView( ) クラスの定義を削除するかコメントアウトします.これに伴い,from django.views.generic import DetailView も不要になります.次に,comments_show(request, comment_id) 関数を定義します.このとき,URL に含まれる comment_id が取得できることに注意してください.また,データベースから pk=comment_id となるデータを抽出するときに,目的の id のデータが見つからない場合に 404 エラーを表示できるように get_object_or_404 を使っています.

comments/views.py
from django.shortcuts import render
from django.shortcuts import get_object_or_404
# from django.http import HttpResponse
from django.urls import reverse_lazy
# from django.views.generic import DetailView
from django.views.generic import CreateView
from django.views.generic import UpdateView
from django.views.generic import DeleteView
from django.shortcuts import redirect
from django.contrib import messages
from .forms import CommentForm
from .models import Comment
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

# Create your views here.

...(中略)...

# class ShowCommentView(DetailView):
#     model = Comment

def comments_show(request, comment_id):
    context = {}
    comment = get_object_or_404(Comment, pk=comment_id)
    context['comment'] = comment
    return render(request, 'comments/show.html', context)

上のコードの最後の行で,HTML ファイル名に show.html を指定してることにも注意してください.

上のコードでは ShowCommentView( ) クラスを削除し,comments_show( ) を定義したので,これが呼び出されるようにルートの定義を変更します.

comments/urls.py
from django.urls import path

from . import views

app_name = 'comments'
urlpatterns = [
    path('', views.comments_index, name='index'),
    path('<int:comment_id>/', views.comments_show, name='show'),
    path('create/', CreateCommentView.as_view(), name='create'),
    path('<int:pk>/update/', UpdateCommentView.as_view(), name='update'),
    path('<int:pk>/delete/', DeleteCommentView.as_view(), name='delete'),
]

最後に HTML のテンプレートのファイル名を変更します.generic モジュールを使うときには モデル名_detail.html というルールでファイル名を命名する必要がありました.しかし,すでにその必要はなくなったので comment_detail.html から show.html に変更します.なお,ファイルの中身の修正は必要ありません.

comments/templates/comments/show.html (comment_detail.htmlからファイル名を変更)
{% extends "base.html" %}

{% block title %}
コメント {{ comment.id }}
{% endblock %}

{% block content %}
  <div class="container">
    <h1 class="my-5">コメント {{ comment.id }}</h1>
    <div class="card mb-3">
      <div class="card-header">
        ID : {{ comment.id }}
      </div>
      <div class="card-body">
        <p class="card-text">Title : </p>
        <h5 class="card-title">{{ comment.title }}</h5>
        <p class="card-text">Body : </p>
        <p class="card-text">{{ comment.body }}</p>
      </div>
      <div class="card-footer">
        Created at : {{ comment.created_at }}<br>
        Updated at : {{ comment.updated_at }}
      </div>
    </div>
    <hr>
    <div>
      <p>
        <a href="{% url 'comments:update' comment.id %}">
          [ 編集 ]
        </a>
        <a href="{% url 'comments:delete' comment.id %}">
          [ 削除 ]
        </a>
      </p>
    </div>
  </div>
{% endblock content %}

Webサーバを起動してブラウザで動作を確認します.以前と同じ内容とデザインで表示できるはずです.

python manage.py runserver ⏎

django-comment-37

目次に戻る