使用ListView

时间:2016-11-27 23:41:59

标签: django django-views

Django docs显示如何通过捕获EmptyPage异常,使用基于函数的视图返回分页查询集的最后一页。

使用基于类的通用视图实现相同功能的最简单方法是什么,例如ListView

我首先认为MultipleObjectMixin的{​​{3}}设置可以满足我的需要,但检查代码表明,如果查询集中没有对象,它只会阻止404错误,而不是零请求页面上的对象。

似乎有两种选择:

  1. 子类ListView并覆盖paginate_queryset(继承自MultipleObjectMixin)或
  2. 子类Paginator并覆盖validate_number,并将paginator_class设置为视图中的子类。
  3. 有没有更好的方法来实现这一目标?

2 个答案:

答案 0 :(得分:2)

这是选项2的样子:

from django.core.paginator import EmptyPage, Paginator
from django.views.generic import ListView

class SafePaginator(Paginator):
    def validate_number(self, number):
        try:
            return super(SafePaginator, self).validate_number(number)
        except EmptyPage:
            if number > 1:
                return self.num_pages
            else:
                raise

class MyView(ListView):
    paginator_class = SafePaginator
    paginate_by = 25

    [...]

这对我来说似乎是最好的选择。

答案 1 :(得分:0)

我知道这很老了,但是我需要它,所以我选择了第一个选项 这是第一个选项的样子:

class MyView(ListView):
    .....
    .....
    def paginate_queryset(self, queryset, page_size):
        """Paginate the queryset, if needed."""
        paginator = self.get_paginator(
            queryset, page_size, orphans=self.get_paginate_orphans(),
            allow_empty_first_page=self.get_allow_empty())
        page_kwarg = self.page_kwarg
        page = self.kwargs.get(page_kwarg) or self.request.GET.get(page_kwarg) or 1
        try:
            page_number = int(page)
        except ValueError:
            if page == 'last':
                page_number = paginator.num_pages
            else:
                # This was modified to prevent value error related stuff
                page_number = 1
        try:
            page = paginator.page(page_number)
            return paginator, page, page.object_list, page.has_other_pages()
        except InvalidPage as e:
            # this is where you should do the invalid Page error handling
            if page_number < 1:
                page_number = 1
            else:
                page_number = paginator.num_pages
            page = paginator.page(page_number)
            return paginator, page, page.object_list, page.has_other_pages()

TBH,这似乎很冗长,如果有更好的选择,我会予以保证