Pages

Pages

2025年12月19日金曜日

【Django】LIstViewでページネーションを行うときにテンプレートに引き渡されるオブジェクト

Djangoの汎用ビューであるListViewがテンプレートファイルに渡されるオブジェクトは通常は【object_list】となる。

最終的にページネーションを行いたいときは、作成するViewに

class SpotListView(ListView):

model = spot

template_name = 'spot_list.html'

paginate_by = 10

のように pagenate_by = 10 とような記述が必要。

この記述を書いて、テンプレートに引き渡されるオブジェクトは二つある 

テンプレートで使える変数
変数名                                    中身
object_list                            model のQuerySet(全件)

*context_object_name =  spots のようにした場合は,[spots]がobject_list の代わりに引き渡される

それに加えて上記の例のようにページネーションを行った場合は、

テンプレートで使える変数
変数名                                    中身
object_list                            model のQuerySet(全件)
page_obj                               ページ用の特別なオブジェクト

上記の二つが渡されることになる。

ページネーションが有効なときに渡される有効な変数は他にもある

テンプレートで使える変数
変数名                                    中身
object_list                            model のQuerySet(全件)
page_obj                               ページ用の特別なオブジェクト
paginator                            全体のページ管理情報
is_paginated                    ページネーションされているか(True / False)

❓なぜ page_obj という名前なのか?

page_obj は Django 内部で、django.core.paginator.Page クラスの インスタンス です。

つまり、単なる QuerySet ではない「ページ番号」「次ページがあるか」などの情報も持っている

👉 「ページそのもの」 を表すオブジェクトなので page_obj という名前になっています。

page_obj が持つ主な属性

属性意味
page_obj.object_list現在ページのデータ
page_obj.number現在のページ番号
page_obj.has_next次ページがあるか
page_obj.has_previous前ページがあるか
page_obj.next_page_number次のページ番号
page_obj.previous_page_number前のページ番号

ページネーション対応のコード例

<ul>
  {% for spot in page_obj %}
    <li>{{ spot.title }}</li>
  {% endfor %}
</ul>

{% if is_paginated %}
  <div class="pagination">
    {% if page_obj.has_previous %}
      <a href="?page={{ page_obj.previous_page_number }}">前へ</a>
    {% endif %}

    {{ page_obj.number }} / {{ page_obj.paginator.num_pages }}

    {% if page_obj.has_next %}
      <a href="?page={{ page_obj.next_page_number }}">次へ</a>
    {% endif %}
  </div>
{% endif %}




0 件のコメント:

コメントを投稿