Skip to main content
 首页 » 编程设计

python之没有数据库的 web2py 中的分页

2024年08月30日40unruledboy

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

请您参考如下方法:

T = 总项目 I = 每页项目数 P = 页面

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

Python 伪代码:

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 

因此,此逻辑全部进入 Controller ,其中 Items_Per_page 在服务器上进行硬编码或在您单击链接或提交按钮时作为 GET/POST 变量接收。如果您希望用户能够在每页中选择不同数量的项目,则需要执行后者。页面肯定是作为 GET/POST var 从请求中接收到的(我建议使用 GET,因为在这种情况下它更容易)。 T,项目总数,很简单——只需说“len(data)”,其中数据是可迭代的。

Controller :

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 
    ) 

这就是 Controller 。现在 View 可以访问数据、开始、结束和总计,以及上一个和下一个。

我刚刚意识到这篇文章的标题和标签是 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 }}