前のページではコメントの一覧表示が 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...
この方法を利用すると,コメントの一覧を Comment.objects.all()
で取得した時に常に Meta
の ordering
で指定した順序でソートされます.なお,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 ⏎
なお,更新順に表示したいので,次のように戻しておくと良い.
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)