2

カスタム ミックスインを使用して、MultipleObjectMixin でページ分割されたクラス ベースのビューのクエリセットにフィルターを適用しています。現在のページがデータセットの範囲外になるようにフィルターを適用すると、明らかに 404 が返されます。私がやりたいことは、この例外をキャッチし、代わりに新しい最後のページにリダイレクトすることです。

問題のビューの私の get_queryset :

def get_queryset(self):
    filters = self.build_location_filter()
    if not filters == None:
        return models.Account.corporateAccounts(locations=self.build_location_filter)
    else:
        return models.Account.corporateAccounts()

助言がありますか?

4

1 に答える 1

4

試す:

def get(self, request, *args, **kwargs):
    try:
        return super(MyView, self).get(request, *args, **kwargs)
    except Http404:
        if kwargs['page'] > self.paginator.num_pages:
            return HttpResponseRedirect(reverse('this_view_paged', kwargs={'page': self.paginator.num_pages}))
        else:
            # re-raise Http404, as the reason for the 404 was not that maximum pages was exceeded
            raise Http404(_(u"Empty list and '%(class_name)s.allow_empty' is False.")
                      % {'class_name': self.__class__.__name__})

アップデート

ごめん。paginatorDjangoがインスタンス変数として追加されたと本当に思いました。これが必要以上に100倍難しくなるので、そうではないのは本当に残念です。パギネーターはpaginate_queryset、実際にHttp404が発生する場所であるでリスされます。つまり、このメソッドを呼び出してページネーターを取得することさえできません。これは、このメソッドから取得するのは例外であるためです。ですから、残念ながら、私がやりたくないDjangoビューロジックの一部を複製して、さらに深く掘り下げる必要がありますが、それが私が見ることができる唯一の前進の道です。コードの複製に頼っているので、それにもかかわらず、私は今、全体をオーバーライドしていますpaginate_queryset方法。新しいコードはDjangoソースから直接コピーされ、コメント付きのセクションに変更が記載されています(後世のために上記の元のコードはそのまま残しています)。

def paginate_queryset(self, queryset, page_size):
        """
        Paginate the queryset, if needed.
        """
        paginator = self.get_paginator(queryset, page_size, allow_empty_first_page=self.get_allow_empty())
        page = self.kwargs.get('page') or self.request.GET.get('page') or 1
        try:
            page_number = int(page)
        except ValueError:
            if page == 'last':
                page_number = paginator.num_pages
            else:
                raise Http404(_(u"Page is not 'last', nor can it be converted to an int."))
        try:
            page = paginator.page(page_number)
            # Moving this line after the try/except block because DRY
            #return (paginator, page, page.object_list, page.has_other_pages())
        except InvalidPage:
            # This used to raise a 404, but we're replacing this functionality
            #raise Http404(_(u'Invalid page (%(page_number)s)') % {
            #                    'page_number': page_number
            #})
            page = paginator.page(paginator.num_pages)

        return (paginator, page, page.object_list, page.has_other_pages())
于 2012-07-19T21:44:32.043 に答える