我有一个简单的Web应用程序,可以显示存储在MongoDB中的产品。我可以轻松地通过网格进行枚举,在每个页面上显示一个20 x 1的表格。但是,我不想显示一个20 x 1的表,而是在保持分页完整性的同时显示一个20 x 2的表。
我的控制器:
def products():
if len(request.args): page=int(request.args[0])
else: page=0
items_per_page=20
limitby=(page*items_per_page,(page+1)*(items_per_page+1))
qset = db(db['products']['name']!='None')
grid = qset.select(limitby=limitby)
return dict(grid=grid,page=page,items_per_page=items_per_page)
我的观点:
{{extend 'layout.html'}}
<h2>Browse available products:</h2>
<table class="products">
{{for i, row in enumerate(grid):}}
{{if i==items_per_page:break}}
<tr>
<td>{{=row.name}}</td>
{{pass}}
</tr>
</table>
{{if page:}}
<a href="{{=URL(args=[page-1])}}">previous</a>
{{pass}}
{{if len(grid)>items_per_page:}}
<a href="{{=URL(args=[page+1])}}">next</a>
{{pass}}
这应该是一项非常简单的任务,但我要把它变得更加困难。我可以在我的控制器中定义两个单独的数据库查询,然后在我的视图中定义两个单独的表,但这看起来似乎是一种荒谬的方法。
答案 0 :(得分:0)
首先,加倍items_per_page
:
items_per_page = 40
然后在视图中,您可以执行以下操作:
{{num_records = min(items_per_page, len(grid))}}
{{for row in xrange((num_records / 2) + (num_records % 2)):}}
<tr>
<td>{{=grid[row * 2].name}}</td>
<td>{{=grid[row * 2 + 1].name if row * 2 + 1 <= num_records - 1 else ''}}</td>
</tr>
{{pass}}
此外,您的控制器代码中存在错误:
(page + 1) * (items_per_page + 1)
应该是:
(page + 1) * items_per_page + 1