最後にコメントの削除機能も generic モジュールを使わずに作成してみましょう.
まず,これまで同様,DeleteCommentView( )
クラスを削除するかコメントアウトします.その結果 from django.views.generic import DeleteView
も不要になります.また,comments_update( )
関数を定義します.
comments/views.py
from django.shortcuts import render
from django.shortcuts import get_object_or_404
from django.urls import reverse
# from django.http import HttpResponse
from django.urls import reverse_lazy
# from django.views.generic import DeleteView
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 DeleteCommentView(DeleteView):
# model = Comment
# success_url = reverse_lazy('comments:index')
# def delete(self, request, *args, **kwargs):
# self.object = comment = self.get_object()
# comment.delete()
# messages.success(self.request, 'コメントを削除しました')
# return redirect(self.get_success_url())
def comments_delete(request, comment_id):
if request.method == 'POST':
comment = get_object_or_404(Comment, pk=comment_id)
comment.delete()
messages.success(request, 'コメントを削除しました')
return redirect(reverse('comments:index'))
else:
context = {}
comment = get_object_or_404(Comment, pk=comment_id)
context['id'] = comment_id
context['title'] = comment.title
context['body'] = comment.body
context['page_title'] = 'コメントの削除'
context['form_name'] = 'コメントを削除しますか'
context['button_label'] = 'コメントを削除する'
return render(request, 'comments/delete_confirm.html', context)
上の43行目で delete_confirm.html
を指定したので,comment_confirm_delete.html
ファイルのファイル名を delete_confirm.html
に変更し,次のような内容に変更します.
comments/templates/comments/delete_confirm.html
{% extends "base.html" %}
{% block title %}
{{ page_title }}
{% endblock %}
{% block content %}
<div class="container">
<h1 class="my-5">{{ form_name }}</h1>
<div class="card mb-3">
<div class="card-header">
ID : {{ id }}
</div>
<div class="card-body">
<p class="card-text">Title : </p>
<h5 class="card-title">{{ title }}</h5>
<p class="card-text">Body : </p>
<p class="card-text">{{ body }}</p>
</div>
</div>
<form method="POST">
{% csrf_token %}
<button type="submit" class="btn btn-primary">{{ button_label }}</button>
</form>
</div>
{% endblock content %}
最後にルートの定義を変更するために urls.py を編集します.
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/', views.comments_create, name='create'),
path('<int:comment_id>/update/', views.comments_update, name='update'),
path('<int:comment_id>/delete/', views.comments_delete, name='delete'),
]
Webサーバを起動してブラウザで動作を確認します.これまで同様に削除の確認画面が表示された後に削除ができることを確認してください.
python manage.py runserver ⏎