コメントの編集機能も generic モジュールを使わずに作成してみましょう.すでに新規登録機能を generic モジュールを使わずに作っているので,編集機能も簡単に作成することができます.
まず,これまで同様,UpdateCommentView( )
クラスを削除するかコメントアウトします.その結果 from django.views.generic import UpdateView
も不要になります.また,comments_update( )
関数を定義します.この内容は comments_create( )
とほぼ同じで,異なる部分だけをハイライトしています.
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 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 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
# def form_valid(self, form):
# self.object = comment = form.save()
# messages.success(self.request, 'コメントを更新しました')
# return redirect(self.get_success_url())
def comments_update(request, comment_id):
if request.method == 'POST':
form = CommentForm(request.POST)
if form.is_valid():
comment = get_object_or_404(Comment, pk=comment_id)
comment.title = form.cleaned_data.get("title")
comment.body = form.cleaned_data.get("body")
comment.save()
messages.success(request, '更新しました')
return redirect(reverse('comments:index'))
else:
# エラーメッセージをつけて返す
context = {}
context['page_title'] = 'コメントの編集'
context['form_name'] = 'コメントの編集'
context['button_label'] = 'コメントを更新する'
context['form'] = form
return render(request, 'comments/form.html', context)
else:
context = {}
comment = get_object_or_404(Comment, pk=comment_id)
context['form'] = CommentForm(
initial={
'title' : comment.title,
'body' : comment.body,
}
)
context['page_title'] = 'コメントの編集'
context['form_name'] = 'コメントの編集'
context['button_label'] = 'コメントを更新する'
return render(request, 'comments/form.html', context)
上の64行目で form.html
を指定したので,comment_form.html
ファイルを削除し,すでにある form.html
を利用します.なお,内容に変更はありません.
comments/templates/comments/form.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 %}
{{ form.as_p}}
<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:pk>/delete/', DeleteCommentView.as_view(), name='delete'),
]
Webサーバを起動してブラウザで動作を確認します.これまで同様に編集ができることを確認してください.
python manage.py runserver ⏎