2

我有一个包含对象列表和两个按钮的页面:show moreshow all. 对象由 AJAX 加载,发送到ItemsListView一个页码:

class ItemsListView(ListView):
    paginate_by = 2

在初始化页面时,JS 变量current_page设置为1,并且 JS 发送 AJAX 请求ItemsListView查看,获取第一页的 2 个对象并呈现它们。

当用户单击show more按钮时,current_page值会增加,并且 JS 会请求下一页的对象。

现在我想实现show all按钮。例如,

如果我们有以下对象列表:[1, 2, 3, 4, 5, 6, 7, 8, 9],在页面上加载对象1并将2被渲染。用户点击后show more,它会渲染对象34. 用户单击 后,show all它将呈现对象567和。89

在我看来,我动态地改变paginate_orphans了:

class ItemsListView(ListView):
    paginate_by = 2
    paginate_orphans = 0

    def get_paginate_orphans(self):
        show_all = json.loads(self.request.GET.get('show_all', 'false'))
        page_kwarg = self.page_kwarg
        page = self.kwargs.get(page_kwarg) or self.request.GET.get(page_kwarg) or 1
        if show_all:
            return self.get_queryset().count() - (int(page) - 1) * 2
        return self.paginate_orphans

它奏效了,但我想知道是否有更优雅的方法来解决这个问题。

4

1 回答 1

0

一点也不优雅:D但更明显......

def get_queryset(self):
    show_all = ...
    page = ...
    qs = super(ItemsListView, self).get_queryset()

    if show_all:
        return qs[int(page)*self.paginate_by:]
    else:
        return qs
于 2015-07-22T12:30:06.880 回答