続いて,コメントの削除機能を実装しよう.まず,views.py に CommentDeleteView を追加する.
comments/views.py (抜粋)
from django.urls import reverse_lazy
# from django.shortcuts import render
# from django.http import HttpResponse
from django.views.generic import ListView
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 .forms import CommentForm
from .models import Comment
# Create your views here.
...(中略)...
class UpdateCommentView(UpdateView):
model = Comment
form_class = CommentForm
success_url = reverse_lazy('comments:index')
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['page_title'] = 'コメントの更新'
context['form_name'] = 'コメントの更新'
context['button_label'] = 'コメントを更新する'
return context
class DeleteCommentView(DeleteView):
model = Comment
success_url = reverse_lazy('comments:index')
次に,ルートを記述する.
comments/urls.py
from django.urls import path
from . import views
app_name = 'comments'
urlpatterns = [
path('', views.CommentIndexView.as_view(), name='index'),
path('<int:pk>/', views.ShowCommentView.as_view(), name='show'),
path('create/', views.CreateCommentView.as_view(), name='create'),
path('<int:pk>/update/', views.UpdateCommentView.as_view(), name='update'),
path('<int:pk>/delete/', views.DeleteCommentView.as_view(), name='delete'),
]
comment_confirm_delete.html を作成する.このとき,モデル名_confirm_delete.html
が標準の名前になることに注意する.
comments/templates/comments/comment_confirm_delete.html
{% extends "base.html" %}
{% block title %}
コメント削除
{% endblock %}
{% block content %}
<div class="container">
<h1 class="my-5">コメントを削除しますか</h1>
<form method="POST">
{% csrf_token %}
<button type="submit" class="btn btn-primary">削除する</button>
</form>
<hr>
<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>
</div>
{% endblock content %}
最後に,詳細表示画面に削除ページへのリンクを設置する.
comments/templates/comments/comment_detail.html (抜粋)
{% block content %}
<div class="container">
<h1 class="my-5">コメント {{ comment.id }}</h1>
<div class="card mb-3">
...(中略)...
</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 %}
実際に投稿したコメントを削除してみよう.詳細画面から[削除]をクリックするとよい.
[削除する]ボタンを押すと実際にコメントが削除される.