【Django】Generic.ListViewでページネーション(ページ送り)する方法

Django Generic ListVew ページネーションの方法

こんばんはエンジニアの眠れない夜です。

今回の記事はDjangoのGeneric.ListViewでページネーションの実装ってどうやるんだろう?簡単にできるかな?と思っている方が対象です。

結論から言うとかなり簡単にできるので気楽に読み進めてくださいね。

【Django】ページネーション用にViewの設定

まずはページネーションさせたいViewのクラスでGenericListViewを継承します。
paginate_byに1ページに表示させたいmodelの数を設定します。ここでは20にしました。
今回モデルは適当にPageとしています。

Python

from django.views import generic

class ListView(generic.ListView):
    template_name = "app/list.html"
    model = Page
    paginate_by = 20

ページネーションさせるためのViewの設定はたったこれだけです。Djangoは後ろでよく働いてくれますね!

template_nameの設定は”app/list.html”としていますが、ここは自分の環境に合わせて設定してください。

【Django】ページネーションのためのurls.pyの設定

リストページのURLを追加しました。設定は至ってシンプルです。


    path('list/', ListView.as_view(), name='list'),
    path('list/', ListView.as_view(), name='list_page'),

1行目はページ番号が指定されない場合のURLです。

2行目はページ番号が指定された場合のURLです。

※ 指定されたページ番号はpageとしてViewに渡されます。

【Django】ページネーションのためのテンプレートの設定(Bootstrap)

Viewの設定とURLの設定ができたのであとは見え方(テンプレート)を調整するだけです。

Bootstrapを使っている人向けにコピペでできるコードを用意しました。

ページネーションを表示したい場所に貼り付けてください。

ベースはNarito Blogさんのものを使わせていただきました。

ページ数が多いとページ番号が画面からはみ出して表示されてしまったので、現在のページ±5に制限しています。

↓この部分


{% if num <= page_obj.number|add:5 and num >= page_obj.number|add:-5 %}
    省略
{% endif %}

まとめ

Bootstrap用のテンプレートの設定だったのでBootstrapを使っていない方は少し見た目の調整が必要かもしれませんがとても簡単にページネーションの設定ができましたね。

何より嬉しいのはView側での設定がたったのpaginate_by = 20だけで済んでしまうことです。

あとはテンプレート側にpage_objを通じていろんな値を取得できるところですね。

今回使った変数をまとめると

page_obj.previous_page_number 前のページ番号

page_obj.next_page_number 次のページ番号

page_obj.has_previous 前のページがあるか

page_obj.has_next 次のページがあるか

page_obj.paginator.page_range 表示可能なページ番号一覧(型:リスト)

こんな感じです。これだけの情報があればページネーションも独自のカスタマイズも簡単にできますね。

それでは素敵なDjangoライフを(^^)v

2 Comments

酒居酒居

この方法ではページ遷移がうまくいきません。ほかのページが用意されていないような状態になります。何か抜けていませんか?

返信する
sleepless-se sleepless-se

酒居酒居さん
コメントありがとうございます!
近日中に確認致します。
しばらくお時間をいただければと思います。
どうぞよろしくお願い致します。

返信する

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください