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 アプリケーションから管理サイトへ

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

ページネーションと更新逆順表示

まず,ページの切り替えボタンをテンプレート化したファイルを新たに作成します.

comments/templates/simple_pagination.html<nav aria-label="Page navigation example">
  <ul class="pagination justify-content-center pagination-lg g-mt-28 g-mb-28">
      {% if page_obj.has_previous %}
          <li class="page-item">
              <a class="page-link" href="?page={{ page_obj.previous_page_number }}">
                  <span aria-hidden="true">«</span>
              </a>
          </li>
      {% else %}
          <li class="page-item">
              <a class="page-link disabled">
                  <span aria-hidden="true">«</span>
              </a>
          </li>
      {% endif %}
      {% if page_obj.has_next %}
          <li class="page-item">
              <a class="page-link" href="?page={{ page_obj.next_page_number }}">
                  <span aria-hidden="true">»</span>
              </a>
          </li>
      {% else %}
          <li class="page-item">
              <a class="page-link disabled">
                  <span aria-hidden="true">»</span>
              </a>
          </li>
      {% endif %}
  </ul>
</nav>

データベースからの取得時に標準で最終更新順になるように,models.py に Meta クラスを追加します.

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'] # 降順ソート

views.py にページネーションに関連する関数を追加します.

comments/views.pyfrom django.conf import settings
from django.shortcuts import render
from django.contrib.auth import authenticate, login, logout
from django.shortcuts import redirect
from django.urls import reverse

from .models import Comment
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

# Create your views here.

def paginate_queryset(request, queryset, count):
    paginator = Paginator(queryset, count)
    page = request.GET.get('page')
    try:
        page_obj = paginator.page(page)
    except PageNotAnInteger:
        page_obj = paginator.page(1)
    except EmptyPage:
        page_obj = paginator.page(paginator.num_pages)
    return page_obj

def comments_index(request):
    if not request.user.is_authenticated:
        return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
    # context = {}
    # context['comments'] = Comment.objects.all()
    paginate = request.GET.get(key="paginate", default="2")
    comments_list = Comment.objects.all()
    page_obj = paginate_queryset(request, comments_list, paginate)
    context = {
        'comments' : page_obj.object_list,
        'page_obj': page_obj,
        'paginate': paginate,
    }
    return render(request, 'comments/index.html', context)

index.html の適当な場所にページネーションのためのリンクを設置します.これはすでにレイアウト化してあるので,そのレイアウトを呼び出すだけで好きな場所にいくらでも配置できることに注意してください

{% block content %}
<h1 class="my-5">コメント一覧</h1>
{% for comment in comments %}
<div class="card mb-3">
  <div class="card-body">
    <h5 class="card-title">
      <a href="{% url 'comments:show' comment.id  %}">
        {{ comment.title }}
      </a>
    </h5>
    <p class="card-text">{{ comment.body }}</p>
  </div>
</div>
{% endfor %}
{% include 'simple_pagination.html' %}
<ul>
    <li>
        <a href="{% url 'comments:index' %}">コメント一覧</a>
    </li>
    <li>
        <a href="{% url 'comments:show' 10  %}">コメント詳細</a>
    </li>
    <li>
        <a href="{% url 'comments:create' %}">コメント投稿</a>
    </li>
    <li>
        <a href="{% url 'comments:update' 10  %}">コメント更新</a>
    </li>
    <li>
        <a href="{% url 'comments:delete' 10  %}">コメント削除</a>
    </li>
    <li>
        <a href="/">トップページへ</a>
    </li>
</ul>
<p>
    <a href="{% url 'comments:logout' %}">
        [ ログアウト ]
    </a>
</p>
{% endblock content %}

一覧ページを表示して,ページの切り替えが上手く動作する事を確認してください.

(py39) C:\Users\lecture\Documents\django\django_comment_auth>python manage.py runserver ⏎
Watching for file changes with StatReloader
Performing system checks...

django2022-00094

目次に戻る