Python Django 入門トップページ


Django によるコメント掲示板の開発:目次

  1. プロジェクトの作成
  2. Git でコミット
  3. Web サーバを起動しておく
  4. Config
  5. Comments アプリケーションを作る
  6. アプリケーションを有効にする
  7. はじめてのビューを作成する
  8. モデルを作る
  9. マイグレーション
  10. テストデータの設定
  11. データベースからコメント一覧を取得して表示してみよう
  12. Bootstrap の導入
  13. コメントの詳細表示
  14. urls.pyの書き方
  15. HTML のテンプレート化
  16. コメントの新規投稿
  17. コメントの編集機能を追加する
  18. さらにテンプレート化
  19. モデル,マイグレーションファイル,フォームの関連
  20. 入力内容の検証(バリデーション)
  21. コメントを削除する
  22. 一覧を逆順にする
  23. ページネーション
  24. フラッシュメッセージ
  25. Static コンテンツの設置
  26. 更新や削除にもフラッシュメッセージを表示
  27. テストの自動化を実現しよう
  28. デバッグツールバーを使う
  29. generic モジュールを使わずにコメント一覧を取得する
  30. コメント一覧のページネーション
  31. 一覧の表示順序を制御する
  32. generic モジュールを使わずにコメントの詳細を表示する
  33. コメント詳細にページ送り機能を作成する
  34. generic モジュールを使わずにコメント登録機能を作成する
  35. generic モジュールを使わずにコメント編集機能を作成する
  36. generic モジュールを使わずにコメント削除機能を作成する

Django によるコメント掲示板の開発

一覧の表示順序を制御する

前のページではコメントの一覧表示が id の順番になっていました.ここでは一覧表示の表示順を制御して最新更新順になるように変更します.

おそらく最も簡単で確実な方法は models.py での Comment クラスの定義の中で標準の順序を指定してしまう方法です.このために次のように Meta クラスを Comment クラスの中で定義します.

comments/models.py
from django.db import models

# Create your models here.

class Comment(models.Model):
    title = models.CharField(max_length=200)
    body = models.CharField(max_length=1000)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ['-updated_at'] # 降順ソート

Webサーバを起動してブラウザで動作を確認します.

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

この方法を利用すると,コメントの一覧を Comment.objects.all() で取得した時に常に Metaordering で指定した順序でソートされます.なお,views.py の中で例えば新規投稿順に変更したい場合は次のように書くこともできます.

comments/views.py (抜粋)
def comments_index(request):
    paginate = request.GET.get(key="paginate", default="2")
    # comments_list = Comment.objects.all()
    comments_list = Comment.objects.all().order_by('-created_at')
    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)

Webサーバを起動してブラウザで動作を確認します.

python manage.py runserver ⏎
django2022-00036

なお,更新順に表示したいので,次のように戻しておくと良い.

comments/views.py (抜粋)
def comments_index(request):
    paginate = request.GET.get(key="paginate", default="2")
    comments_list = Comment.objects.all()
    # comments_list = Comment.objects.all().order_by('-created_at')
    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)

目次に戻る