Django分页 | 获取分页项目在页索引中的当前索引 (而非页索引范围本身)
我正在用Django搭建一个照片画廊。
这个画廊是按类别来分类的。
我已经把每个类别的图片结果分页,每页显示n张图片。我还想在只显示单张图片的页面上使用分页功能,并添加“上一张”和“下一张”按钮,方便用户查看该类别中的前一张和后一张图片。
我的想法是获取当前图片的索引,然后把这个索引作为链接,指向 /category/CUR_IMG_ID_PAGINATION_LIST/。这样分页后的结果就能得到和当前图片索引相同的索引。
举个例子,如果我想要的图片是150张中的第45张,那么在对这150张图片进行分页时,第45张就会是我想要的那一页。
如果有更简单的方法,请告诉我。Django 1.1
1 个回答
1
我觉得你描述的方法是可行的,因为在后台,Django 实际上是使用 SQL 的 LIMIT
来让数据库处理数据的排序和返回。这是因为数据库在处理这类事情时效率很高,所以这样做是合理的。
关键是保持查询的一致性,正如你所展示的,你可以用同一个视图来实现这一点。这个视图可以简单地有一个模式,用来改变分页的页数。
你可能会得到像这样的 URL...
# View all "landscape" items in gallery mode starting on page 3
http://www.example.com/gallery/landscape/multi/3
# View the 45th landscape item in singular mode
http://www.example.com/gallery/landscape/single/45
当模板被渲染时,分页器会提供 has_next
和 has_previous
方法,让你知道是否可以显示“下一页”或“上一页”的链接。
我想的视图大概是这样的(这完全是我随便想的,没经过测试)...
url(r'gallery/(?P<category>.+)/(?P<mode>.+)/(?P<offset>\d+)$', 'whatever.views.media_gallery'),
def media_gallery(request, category, mode, offset):
"""
Render a media gallery.
category = media item category filter
mode = ( multi | single )
offset = The pagination offset in multi mode or the media ID in single mode
"""
if mode == 'multi':
per_page = 20 # or however many items per page
elif mode == 'single':
per_page = 1
else:
pass # handle this however
# Queryitems
raw_media_items = Media.objects.filter(category=category)
# Setup paginator
paginator = Paginator(raw_media_items, per_page)
try:
# in multi mode offset is the page offset
# in single mode offset is the media ID
page = int(offset)
except:
page = 1
try:
media_items = paginator.page(page)
except (EmptyPage, InvalidPage):
media_items = paginator.page(paginator.num_pages)
if len(paginated_items) == 1:
# Render single view
return render_to_response('gallery/gallery_view.html',
{ 'media_item':media_items[0], 'paginator':paginator },
context_instance=RequestContext(request) )
else:
# Render gallery view
return render_to_response('gallery/gallery_view.html',
{ 'media_items':media_items, 'paginator':paginator },
context_instance=RequestContext(request) )