【问题标题】:Django pagination | get current index of paginated item in page index, (not the page index range itself)Django 分页 |获取页面索引中分页项的当前索引,(不是页面索引范围本身)
【发布时间】:2011-02-02 17:18:28
【问题描述】:

我正在尝试使用 Django 构建照片库。

按类别设置。

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

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

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

如果有更简单的方法,请告诉我。 Django 1.1

【问题讨论】:

    标签: python django pagination django-pagination


    【解决方案1】:

    我认为您描述它的方式可以正常工作,因为在幕后我相信 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_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) )
    

    【讨论】:

      猜你喜欢
      • 2018-01-06
      • 2018-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多