Python Django 入門トップページ


ユーザ認証とコメント掲示板の開発

  1. プロジェクトの概要
  2. プロジェクトの作成と初期設定
  3. アプリケーションの作成と有効化
  4. ルートの記述
  5. ビューの定義
  6. HTML のテンプレート化
  7. HTML ファイルの作成
  8. Web ページ雛形の表示確認
  9. トップページの作成
  10. データベースのマイグレーション
  11. ユーザの作成
  12. ユーザ認証機能の実装
  13. セッション情報の確認
  14. ユーザ認証の状態を表示
  15. Navbar を設置
  16. モデルの作成とマイグレーション
  17. テストデータの投入
  18. コメントの一覧表示
  19. ページネーションと更新逆順表示
  20. コメント投稿機能の実装
  21. フラッシュメッセージ
  22. コメント詳細表示ページの実装
  23. 投稿者のユーザ名とメールアドレスの表示
  24. 投稿者であるかどうかの判断
  25. 編集・更新機能の実装
  26. コメント削除機能の実装
  27. Navbar の調整
  28. Profile の表示
  29. Profile の編集と更新
  30. パスワードの変更
  31. 管理サイトの準備
  32. 管理ユーザの登録
  33. 管理サイトへのログインとスタッフの登録
  34. グループの追加と権限の付与
  35. 管理サイトに comments アプリケーションを登録
  36. Comments アプリケーションから管理サイトへ

ユーザ認証とコメント掲示板の開発

投稿者であるかどうかの判断

ここではコメントの編集や削除を投稿者だけが行えるような機能を実装します.つまり,ログイン中ユーザの id とコメントの owner_id が一致するかどうかを判断します.

実装には様々な方法が考えられますが,ここでは Comment モデルの中にメソッドを定義することにします.

comments/models.pyfrom 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.pydef 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...

django2022-00102

django2022-00103

目次に戻る