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 件のコメント:
コメントを投稿