我正在尝试使用Django构建一个照片库。
按类别设置。
我已经按每页n个图像分类了一个类别的结果。我还想在页面上使用仅显示单个图像的分页器,并为该类别中的上一个/下一个图像设置上一个/下一个按钮。
我的想法是获取图像本身的当前索引并将其作为/ category / CUR_IMG_ID_PAGINATION_LIST /的链接,因为对整个集合进行分页的结果将产生与分页结果中的当前图像索引相同的索引
例如,如果我想要的图像是一个类别的150个图像中的图像45,那么当我对150个图像进行分页时,45将是我想要的页面的实际编号。
如果有更简单的方法,请告诉我。 Django 1.1
答案 0 :(得分:0)
我认为你描述它的方式可以正常工作,因为在幕后我相信Django正在做的是使用SQL LIMIT
来简单地让数据库做出繁重的工作来整理出什么和多少要返回的数据。因为数据库已针对执行此类事件进行了优化,所以这可能是执行此操作的合理方法。
关键可能是保持查询相同,并且您已经证明可以使用相同的视图来执行此操作。该视图可以简单地具有一种改变分页页数的奇特方式。
你最终会得到像这样的网址......
# 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) )