私はweb2pyでWebアプリケーションに取り組んでいます。ページネーションを導入したいのですが、アプリケーションにデータベースがありません。それは必要ありません。最大 100 個の項目のリストを作成しますが、50 個ほどにすることもできます。必要なページ数を生成し、1 ページあたり 10 個を表示したいと考えています。誰かが私を正しい方向に向けることができますか? web2py チュートリアルの意味がわかりません。
1 に答える
T = 総アイテム数 I = 1 ページあたりのアイテム数 P = ページ数
T=100、I=10、page=0 (最初のページ) とする
Pythonic 擬似コード:
num_pages = Math.Ceil( T / I ) # ceil(100/10) = 10 pages
cur_page = P # 0
start = I*P # 10 * 0 = 0
end = start + ipp # 0 + 10 = 10
if end > total: # false
end = total
items = allitems[start:end] # this page's items
これで始められるはずです。必要に応じて、テスト、デバッグ、微調整を行います。
T=322、I=50、ページ=6 とする
num_pages = Math.Ceil( T / I ) # ceil(322/50) = 7 pages
cur_page = P # 6
start = I*P # 50 * 6 = 300
end = start + ipp # 300 + 50 = 350
if end > total: # true
end = total # end = 322, not 350
items = allitems[start:end] # this page's items
したがって、このロジックはすべてコントローラに配置され、Items_Per_page はサーバー上でハードコーディングされるか、リンクまたは送信ボタンをクリックしたときに GET/POST 変数として受信されます。ユーザーがページごとに異なる量のアイテムを選択できるようにする場合は、後者を行う必要があります。ページは間違いなく GET/POST var としてリクエストから受信されます (この場合は GET の方が簡単なのでお勧めします)。アイテムの総数である T は簡単です。data が iterable である場合、「len(data)」と言うだけです。
コントローラ:
def show_items():
T = len(data) # not sure where your data comes from, or if you have to process a query first...
P = request.vars.page # e.g. http://blah.com/show_items?page=0
I = request.vars.ipp # e.g. http://blah.com/show_items?page=0&ipp=50
#now the code from before...
num_pages = Math.Ceil( T / I ) # ceil(100/10) = 10 pages
cur_page = P # 0
start = I*P # 10 * 0 = 0
end = start + ipp # 0 + 10 = 10
if end > total: # false
end = total
items = allitems[start:end] # this page's items
return dict(
data=items,
start=start,
end=end,
total=total,
prev=page-1 if page > 0 else None, # set to None if page =0
next=page+1 if page < num_pages else None, # set to None if page == num_pages
)
それでコントローラーです。これで、ビューは data、start、end、total、および prev と next にアクセスできるようになりました。
投稿に web2py というタイトルとタグが付けられていることに気付きました...したがって、意図したフレームワークに関する記述は無視してください。また、Python 2.6 より前では利用できない x = value_if_true if 式 else value_if_false を使用していると思うので、リファクタリングする必要があるかもしれません。
{{ extend 'layout.html' }}
{{ if not total > 0: }}
No results
{{ else: }}
<div id='items-container'>
<div id='items-nav'>
<span class='header'>Showing {{=start}} to {{=end} of {{=total}}</span><br />
{{ if prev != None: }}
<a href='show_items?ipp={{=ipp}}&page={{=prev}}' class='prev p-nav' style='float: left'>< Prev</a>
{{ pass }}
{{ if next != None: }}
<a href='show_items?ipp={{=ipp}}&page={{=next}}' class='next p-nav' style='float: right'>Next ></a>
{{ pass }}
</div>
{{ for item in items: }}
<div class='item'>
{{=item.title}}<br />
{{=item.description}}<br />
Put whatever else about the item...
</div>
{{ pass }}
</div>
{{ pass }}