Djangoにページネーションを追加する

Djangoでページネーションを表示する手順を説明します。

Djangoアプリケーション内のviews.pyを編集します。

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

def post_list(request):
  '''
  記事の一覧を表示します。
  '''

  # QuerySetsですべてのポストを取得する
  object_list = Post.published.all()

  paginator = Paginator(object_list, 3) # 3 posts in each page
  page = request.GET.get('page')
  try:
    posts = paginator.page(page)
  except PageNotAnInteger:
    posts = paginator.page(1)
  except EmptyPage:
    posts = paginator.page(paginator.num_pages)

  # テンプレートを表示
  return render(request, 'blog/post/list.html', {'page': page,'posts': posts})

template直下にpagination.htmlを作成します。

<div class="pagination">
  <span class="step-links">
    {% if page.has_previous %}
      <a href="?page={{ page.previous_page_number }}">前へ</a>
    {% endif %}
    <span class="current">
      Page {{ page.number }} of {{ page.paginator.num_pages }}
    </span>
    {% if page.has_next %}
      <a href="?page={{ page.next_page_number }}">次へ</a>
    {% endif %}
  </span>
</div>

上のpagination.htmlを一覧ページに取り込みます。
{% include "pagination.html" with page=posts %}の部分です。

{% block title %}My Blog{% endblock %}

{% block content %}
  <h1>My Blog</h1>
  {% for post in posts %}
    <h2>
      <a href="{{ post.get_absolute_url }}">
        {{ post.title }}
      </a>
    </h2>
    <p class="date">
      Published {{ post.publish }} by {{ post.author }}
    </p>
    {{ post.body|truncatewords:30|linebreaks }}
  {% endfor %}
  {% include "pagination.html" with page=posts %}
{% endblock %}

これでページネーションを表示できます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です