2

オブジェクトのリストと 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がレンダリングされます。ユーザーが をクリックすると、オブジェクト、、、およびがレンダリングされます。34show all56789

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 に答える