我正在开发 web2py 中的 Web 应用程序。我想为其引入分页,但我的应用程序中没有数据库。它不是必需的。我将有一个最多 100 个项目的列表,但可能少至 50 个。我想生成所需的页数,并希望每页显示 10 个。谁能指出我正确的方向?无法理解关于它的 web2py 教程。
问问题
596 次
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'>< 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 }}
于 2012-07-23T20:30:26.820 回答