ここではコメントの編集や削除を投稿者だけが行えるような機能を実装します.つまり,ログイン中ユーザの id とコメントの owner_id が一致するかどうかを判断します.
実装には様々な方法が考えられますが,ここでは Comment モデルの中にメソッドを定義することにします.
comments/models.py
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Comment(models.Model):
title = models.CharField(max_length=200)
body = models.CharField(max_length=1000)
owner = models.ForeignKey(User, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
ordering = ['-updated_at'] # 降順ソート
# ログインユーザがコメント投稿者かどうかを判断する
def is_owner(self, user):
if self.owner.id == user.id:
return True
return False
views.py の中でいま定義したメソッドを使って投稿者であるかどうかの情報を保持しておきます.
comments/views.py
def comments_show(request, comment_id):
if not request.user.is_authenticated:
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
context = {}
# context['comment_id'] = comment_id
comment = get_object_or_404(Comment, pk=comment_id)
context['comment'] = comment
context['is_owner'] = comment.is_owner(request.user)
return render(request, 'comments/show.html', context)
show.html の中で投稿者であるかどうかの情報を利用して表示内容を切り替えます.
comments/templates/comments/show.html
{% block content %}
<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">
{% if is_owner %}
投稿者です<br>
{% else %}
投稿者ではありません<br>
{% endif %}
Owner ID : {{ comment.owner_id }}<br>
Owner UserName : {{ comment.owner }}<br>
Owner E-mail : {{ comment.owner.email }}<br>
Created at : {{ comment.created_at }}<br>
Updated at : {{ comment.updated_at }}
</div>
</div>
<hr>
{% if is_owner %}
<div>
<p>
<a href="{% url 'comments:update' comment.id %}">
[ 編集 ]
</a>
<a href="{% url 'comments:delete' comment.id %}">
[ 削除 ]
</a>
</p>
</div>
{% else %}
<div>
<p>[ 編集 ] [ 削除 ]</p>
</div>
{% endif %}
Web サーバを起動してコメントの詳細情報を表示してみよう.自身が投稿したコメントでは「編集」「削除」リンクが有効になり,他ユーザのコメント詳細ページでは無効化されていることに注意しよう.ただし,この段階では「編集」リンクを使えませんが,容易に想像できる http://127.0.0.1:8000/10/update/ という URL をブラウザに直接入力すると編集ページに到達してしまうという問題点があります.次のページではこのような問題点も考慮しながらコメントの編集・更新機能を実装します.
(py39) C:\Users\lecture\Documents\django\django_comment_auth>python manage.py runserver ⏎
Watching for file changes with StatReloader
Performing system checks...