2

私はweb2pyでWebアプリケーションに取り組んでいます。ページネーションを導入したいのですが、アプリケーションにデータベースがありません。それは必要ありません。最大 100 個の項目のリストを作成しますが、50 個ほどにすることもできます。必要なページ数を生成し、1 ページあたり 10 個を表示したいと考えています。誰かが私を正しい方向に向けることができますか? web2py チュートリアルの意味がわかりません。

4

1 に答える 1

3

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'>&lt; Prev</a>
      {{ pass }}

      {{ if next != None: }}
      <a href='show_items?ipp={{=ipp}}&page={{=next}}' class='next p-nav' style='float: right'>Next &gt;</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 }}
于 2012-07-23T20:30:26.820 に答える