1

我正在尝试用 Django 建立一个照片库。

它是按类别设置的。

我已将一个类别的结果按每页 n 个图像进行分页。我还想在页面上使用仅显示单个图像的分页器,并为该类别中的上一个/下一个图像提供一个上一个/下一个按钮。

我的想法是获取图像本身的当前索引,并将其作为指向 /category/CUR_IMG_ID_PAGINATION_LIST/ 的链接,因为对整个集合进行分页将产生与分页结果中的当前图像索引相同的索引。

例如,如果我想要的图像是一个类别总共 150 张图像中的 45 张,那么当我对 150 张图像进行分页时,45 将是我想要的实际页面数。

如果有更简单的方法可以做到这一点,请告诉我。姜戈 1.1

4

1 回答 1

1

我认为您描述它的方式可以正常工作,因为在幕后我相信 Django 正在做的是使用 SQLLIMIT来简单地让数据库完成整理要返回的数据和返回多少数据的繁重工作。因为数据库已针对执行此类操作进行了优化,所以执行此操作可能是一种合理的方式。

关键可能是保持查询相同,并且正如您所展示的,您可以使用相同的视图来做到这一点。该视图可以简单地具有一种模式,这是一种更改分页页数的奇特方式。

你最终可能会得到这样的网址......

# 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方法,让您知道是否可以使用渲染 Next/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) )
于 2010-03-31T03:18:14.383 回答