2

我正在开发 web2py 中的 Web 应用程序。我想为其引入分页,但我的应用程序中没有数据库。它不是必需的。我将有一个最多 100 个项目的列表,但可能少至 50 个。我想生成所需的页数,并希望每页显示 10 个。谁能指出我正确的方向?无法理解关于它的 web2py 教程。

4

1 回答 1

3

T = 总项目 I = 每页项目 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, page=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 变量从请求中接收的(我会推荐 GET,因为在这种情况下它更容易)。T,项目总数,很简单——只需说“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
    )

这就是控制器。现在视图可以访问数据、开始、结束和总计,以及上一个和下一个。

我刚刚意识到这篇文章的标题和标签是 web2py ......所以请忽略有关您预期框架的任何陈述,这是一个 web2py 解决方案(未经测试,可能需要调整)。另外,我使用 x = value_if_true if 表达式 else value_if_false 我认为在 python 2.6 之前不可用,所以你可能需要重构。

{{ 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 回答