diadia

興味があることをやってみる。自分のメモを残しておきます。

django ページネーションについて

ページネーションについて

ページネーションは一覧表示させるオブジェクトを1ページ内にどれだけ分割して表示させるか。それに関わる技術のことのようだ。
技術書を読んでいるとなかなかに難しい分野らしい。何が難しいのかも理解できなかったので、そのへんが理解できるまでにはなりたいと思う。

ドキュメント

https://docs.djangoproject.com/ja/2.2/topics/pagination/

メモ

ページネーションの必要素は2要素のようだ。表示するべきリストオブジェクトの作成とのページを繰る関係のオブジェクトである。で前者はPageクラスインスタンスにobject_list属性で表現できるようだ。https://docs.djangoproject.com/ja/2.2/topics/pagination/#django.core.paginator.Page.object_list
後者については同じくPageクラスインスタンスに属性やメソッド使ったりすると表現できるようだ。https://docs.djangoproject.com/ja/2.2/topics/pagination/#django.core.paginator.Page.number

page_obj.object_listは普段object_listをhtml上に表現するように扱えばいいので特に問題はないだろう。page_obj.numberについて考える。まずpage_obj.numberはどこに使うか?という問題である。言うまでもなくviews.pyのrequest.GETに関するコードの流れの最終着地点はcontextに追加し、render関数を介してhtml上に表示させることだ。だからpage_obj.numberはhtmlに表現される。htmlの下部の"前へ","1","2","3","次へ"というものだ。page_obj.numberはここに使われる。またpage_objには以下のメソッドがある。これらを使うと前へ、とか"3"を表現できるようになりそうだ。

  • page_obj.has_next() :
    次のページが存在する時Trueを返す。
  • page_obj.has_previous() :
    前のページが存在する時Trueを返す。
  • page_obj.has__other_pages() :
    次のページまたは前のページが存在する時Trueを返す。
  • page_obj.has_next_number() :
    次のページ数を返す。次のページが存在しない場合はInvalidPage例外を起こす。
  • page_obj.previous_page_number() :
    前のページ数を返します。前のページが存在しないときは InvalidPage 例外を起こします。
  • page_obj.start_index() :
    ページ上の最初のオブジェクトに対する、1から始まるインデックスを返します。これは、ページネータのリストに含まれる全オブジェクトに対するインデックスです。たとえば、5個のオブジェクトのリストを各ページ2オブジェクトでページネーションしている場合、2ページ目の start_index() は 3 を返すでしょう。
  • page_obj.end_index() :
    ページ上の最後のオブジェクトに対する、1から始まるインデックスを返します。これは、ページネータのリストに含まれる全オブジェクトに対するインデックスです。たとえば、5個のオブジェクトのリストを各ページ2オブジェクトでページネーションしている場合、2ページ目の end_index() は 4 を返すでしょう。

だからhtmlではpage_obj.object_listの使い方としては、

...html

{% for obj in page_obj.object_list %}

{{ obj }}

{% endfor %}

ページを繰る関係で言えばhtmlでは以下のように表現できる。

...html 

{%for n in  page_obj.paginator.page_range %}

<a href="?page={{ n }}">{{ n }}</a>

{% endfor %}

 

page_objの作り方

page_objはPageクラスのインスタンスである。しかしながらpage_obj=Page()と作るわけではないようだ。作り方はpage_obj = pagenator_obj.page(number)で作る。pagenator_obj=Pagenator()で作成する。