web2py中的分页没有数据库

时间:2012-07-23 20:14:25

标签: python pagination web2py

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

1 个答案:

答案 0 :(得分:3)

T =总项目数 我=每页的项目数 P =页面

设T = 100,I = 10,页= 0(初始页)

Pythonic Psuedocode:

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,项目总数很容易 - 只需说“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,如果表达式为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 }}