Django分页 | 获取分页项目在页索引中的当前索引 (而非页索引范围本身)

1 投票
1 回答
2163 浏览
提问于 2025-04-15 21:03

我正在用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_nexthas_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) )

撰写回答