新規投稿機能の次の機能として,コメントの編集(更新)機能を実現しよう.まず,views.py にクラスを追加する.
comments/views.py
from django.urls import reverse_lazy
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 .forms import CommentForm
from .models import Comment
# Create your views here.
... (中略) ...
class CreateCommentView(CreateView):
model = Comment
form_class = CommentForm
success_url = reverse_lazy('comments:index')
class UpdateCommentView(UpdateView):
model = Comment
form_class = CommentForm
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'),
]
さらに,詳細表示ページに「編集」リンクを設置する.
comments/templates/comments/comment_detail.html(抜粋)
{% 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>
</p>
</div>
</div>
{% endblock content %}
なおフォームを表示するための HTML は新規投稿のフォームと同じものが使われるため,ここで作成する必要はない.
詳細表示ページの最下部にある [編集] をクリックする.
投稿フォームに投稿された内容が表示されるので,中身を書き換えて [コメントを投稿する] ボタンをクリックする(ボタンのラベルなどが新規投稿時と変わらないのでこれは後で変更する).
コメントのタイトルや本文も変更されていることが確認できました.