GAE/Pでページネーションを実装する方法
~バクバクなってるー鼓動旅の始まりの合図さ~
今日はGAE/Pでページネーションを実装する方法について書いてみます。
リクエストURLはhttp://localhost:8080/gae_test/index?page=hogehogeを想定しています。
hogehogeのところに数値が入る仕組みですね。
そのURLにリクエストしたとき、ざっと以下のコードで
1ページに5個だけデータを表示します。
http://code.google.com/intl/ja/appengine/docs/python/datastore/gqlqueryclass.html
今回のポイント1つ目はfetchメソッドです。
fetch(limit,offset=0)は、limitでクエリの結果を返す数を制限し、offsetで結果をスキップする数を指定します。
例えば2ページ目を表示しようとしていたとき、以下のコードによりdataをkeyで降順に並び替えた後、 5レコードスキップし、その後から6レコードを結果として返します。
次のポイントはわざとfetchするサイズを_MAXDISPLAYSIZE+1にしていることですね。
限界値+1を取って、取れたら次のページが存在すると判定しています。
あとはテンプレート側で、若干省略しましたが、以下のように書けばページネーションの完成です。
ずっと夜明けのBEATを聞いて書いてたので今日は夜明けのBEAT。
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
何かぼんやりと勉強会をしたいなぁと思っています。
ネタ募集中です。
関西で開催する予定ですので、関西の方はお楽しみに!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
今日はGAE/Pでページネーションを実装する方法について書いてみます。
リクエストURLはhttp://localhost:8080/gae_test/index?page=hogehogeを想定しています。
hogehogeのところに数値が入る仕組みですね。
そのURLにリクエストしたとき、ざっと以下のコードで
1ページに5個だけデータを表示します。
import math _MAXDISPLAYSIZE=5 def get(self): next = None data = Data.all() count = data.count() maxpage = int(math.ceil(float(count)/_MAXDISPLAYSIZE)) page = self.request.get('page') if page: page = long(page) else: # toppage page = 1 data = data.order("-__key__").fetch(_MAXDISPLAYSIZE+1, (page-1)*_MAXDISPLAYSIZE) # adjust display size if len(data) == _MAXDISPLAYSIZE+1: next = page + 1 data = data[:_MAXDISPLAYSIZE] prev = page - 1 if prev < 0: prev = 0 # # template render #
Google CodeのGqlQueryクラスの説明が参考になります。
http://code.google.com/intl/ja/appengine/docs/python/datastore/gqlqueryclass.html
今回のポイント1つ目はfetchメソッドです。
fetch(limit,offset=0)は、limitでクエリの結果を返す数を制限し、offsetで結果をスキップする数を指定します。
例えば2ページ目を表示しようとしていたとき、以下のコードによりdataをkeyで降順に並び替えた後、 5レコードスキップし、その後から6レコードを結果として返します。
data = data.order("-__key__").fetch(_MAXDISPLAYSIZE+1, (page-1)*_MAXDISPLAYSIZE)
次のポイントはわざとfetchするサイズを_MAXDISPLAYSIZE+1にしていることですね。
限界値+1を取って、取れたら次のページが存在すると判定しています。
あとはテンプレート側で、若干省略しましたが、以下のように書けばページネーションの完成です。
{% if prev %}前へ ...{% endif %} {{ page }} {% if next %}... {{ maxpage }} 次へ{% endif %}
ずっと夜明けのBEATを聞いて書いてたので今日は夜明けのBEAT。
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
何かぼんやりと勉強会をしたいなぁと思っています。
ネタ募集中です。
関西で開催する予定ですので、関西の方はお楽しみに!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
コメント
コメントを投稿