まず,ページの切り替えボタンをテンプレート化したファイルを新たに作成します.
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.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'] # 降順ソート
views.py にページネーションに関連する関数を追加します.
comments/views.py
from 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...