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