最後にコメントの削除機能も generic モジュールを使わずに作成してみましょう.
まず,これまで同様,DeleteCommentView( )
クラスを削除するかコメントアウトします.その結果 from django.views.generic import DeleteView
も不要になります.また,comments_update( )
関数を定義します.
comments/views.py
from django.urls import reverse_lazy
from django.urls import reverse
from django.shortcuts import render
from django.shortcuts import get_object_or_404
# 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 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 form_valid(self, form):
# messages.success(self.request, 'コメントを削除しました')
# return super().form_valid(form)
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['comment'] = comment
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>
<form method="POST">
{% csrf_token %}
<button type="submit" class="btn btn-primary">{{ button_label }}</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 %}
最後にルートの定義を変更するために 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サーバを起動してブラウザで動作を確認します.これまで同様に削除の確認画面が表示された後に削除ができることを確認してください.
(py39) C:\Users\lecture\Documents\django\django_comment>python manage.py runserver ⏎
Watching for file changes with StatReloader
Performing system checks...