ここでは一覧表示で行ったときと同じように,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 ⏎