これまでの作業で,コメントの新規投稿と更新ができるようになった.しかしながら,新規投稿と更新の画面を比べると全く同じであるのでユーザに混乱をきたすであろう.
まずは,新規投稿ページ
こちらは更新ページ
ここで,テンプレート化の方法をうまく活用して,更新画面の見出しやボタンのラベルなどをここで変更しておこう.まず,comment_form.html を修正する.
comments/templates/comments/comment_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 %}
次に,views.py で comment_form に渡す文字列を設定する.このとき get_context_data という関数を作り,その中で値(文字列)を設定すると良い.なお,**kwargs
は可変個のキーワード引数を取ることを意味します.
comments/views.py (抜粋)
class CreateCommentView(CreateView):
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 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
これによって,新規投稿画面と更新画面でボタンのラベルなどが異なるようになった.