Python+Flask+Bootstrapで超簡単にページネーションを実装する方法(flask_paginate)
こんにちは、せつやです。
この記事では、Python Flaskによる、ページネーションの作り方を紹介しています。
これからページネーションを作ろうと思っている方の参考になれば幸いです。
是非みていってください。🙂
flask_paginate 完成イメージ
1、flask-paginateをPIPインストール
flask-paginateを実行環境にインストールします。
2、上記1、でインストールしたモジュールをインポート
#============================================================================================
# flask_paginate
#============================================================================================
from flask_paginate import Pagination, get_page_parameter
3、1ページに表示させるデータを分割し、必要なデータを用意する
#+------------------------------------------------------------------------------------------+
#+ トップページ
#+------------------------------------------------------------------------------------------+
# index.htmlを表示する場所を定義
@app.route('/')
def index():
# ページに表示させたいデータが入っているリストを用意
Data_List = MainData()
# (1) 表示されているページ番号を取得(初期ページ1)
page = request.args.get(get_page_parameter(), type=int, default=1)
# (2)1ページに表示させたいデータ件数を指定して分割(1ページに3件表示)
PageData = Data_List[(page - 1)*3: page*3]
# (3) 表示するデータリストの最大件数から最大ページ数を算出
MaxPage = (- len(Data_List) // 3) * -1
# (4) ページネーションに必要なデータをHTMLファイルに引き渡します。
return render_template('index.html', PageData = PageData, CurPage=page, MaxPage=MaxPage)
コードの補足説明
(1) 現在されているページ番号を取得する。
ここでは、index.htmlで現在表示させているページ番号を取得します。
default=1 の部分を変更することで
初期ページ(ページ番号を指定しないURL)に表示させるページを指定できます。
(2) 1ページに表示させたいデータ件数を指定して分割(1ページに3件表示)
ここでは、Pythonのスライスを使用してデータリストに格納されている連続したデータをページ毎に
表示する分だけ分割して変数に格納をしています。
PageData = Data_List[(page – 1)*3: page*3]
3の部分を変更することで、表示件数を変更できます。
(3) データリストの最大件数と1ページに表示させる件数を元に最大ページ数を算出
上記(2)で指定した個数でデータを分割した場合何ページ分のデータになるかを算出しています。
MaxPage = (- len(Data_List) // 3) * -1
最大ページ数を算出しておくことで
ページネーションの終わりを条件に使用できるようにしておきます。
3の部分は、上記(2)同様1ページに表示させるデータ件数を指定します。
- len(変数)で、データの件数が算出されます
- // で余りを繰り上げした商を求めることができます
4、HTMLでページネーションを実装
<!--(1)前のページ-->
{% if (CurPage - 1) > 0 %}
<a href="./?page={{ CurPage - 1}}" class="btn btn-outline-secondary">{{ CurPage - 1}}</a>
{% endif %}
<!--(1)現在のページ-->
<a href="#" class="btn btn-secondary">{{ CurPage }}</a>
<!--(2)次のページ-->
{% if (CurPage + 1) <= MaxPage %}
<a href="./?page={{ CurPage + 1}}" class="btn btn-outline-secondary">{{ CurPage + 1}}</a>
{% endif %}
コードの補足説明
HTML内で Jinja を使用し、条件によって動的にボタンを表示させていきます。
(1) 前のページ
表示させているページ番号の前のページが1より小さい場合は、このリンクは表示させないという条件
CurPage – 1 : ( 現在のページ番号 – 1 ) = 前のページ番号
(2) 現在のページ
現在表示させているページのリンクになります。
※ どんな場合でも、このリンクは表示されます。
CurPage : 現在のページ番号
(3) 次のページ
表示させているページ番号の次のページが最大ページ数より大きい場合は、このリンクは表示させないという条件
CurPage + 1 : ( 現在のページ番号 + 1 ) = 次のページ番号
MaxPage : 最大ページ番号
5、Bootstrap(CSS)をHTMLに読み込ませる
<head>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
</head>
以上になります。
ここでは、シンプルに実装方法のみを紹介させていただきました。
条件を追加し、ボタンの数を増やしたり
見た目などを好きなものに変えなど、自由にカスタマイズをしてみてください。
ここまで、みていただき、本当にありがとございました。
これからもよろしくお願いします。では。🙂
ディスカッション
コメント一覧
まだ、コメントがありません