首页 > 解决方案 > Django:分页器错误:“用户”类型的对象没有 len()

问题描述

我正在学习使用分页器,因为我的列表真的很长!由于出现错误,我无法实现它。我注意到,如果我删除,paginate_by = 10那么错误就会消失,但我很确定这是分页所必需的。为什么 get_queryset 与分页器冲突。

class NotificationsListView(ListView):
    template_name = "notices/list.html"
    paginate_by = 10

    def get_context_data(self, *args, **kwargs):
        context = super(NotificationsListView, self).get_context_data(*args, **kwargs)
        qs = self.get_queryset().notifications.all()
        paginator = Paginator(qs , self.paginate_by)
        page = self.request.GET.get('page')
        try:
            notification_pages = paginator.page(page)
        except PageNotAnInteger:
            notification_pages = paginator.page(1)
        except EmptyPage:
            notification_pages = paginator.page(paginator.num_pages)
        context['notifications'] = notification_pages
            return context    
        def get_queryset(self, *args, **kwargs):
        request = self.request
        return User.objects.get(pk=self.request.user.pk)

追溯:

File "myapp\lib\site-packages\django\core\paginator.py" in count
  85.             return self.object_list.count()

During handling of the above exception ('User' object has no attribute 'count'), another exception occurred:

File "myapp\lib\site-packages\django\core\handlers\exception.py" in inner
  35.             response = get_response(request)

File "myapp\lib\site-packages\django\core\handlers\base.py" in _get_response
  128.                 response = self.process_exception_by_middleware(e, request)

File "myapp\lib\site-packages\django\core\handlers\base.py" in _get_response
  126.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "myapp\lib\site-packages\django\views\generic\base.py" in view
  69.             return self.dispatch(request, *args, **kwargs)

File "myapp\lib\site-packages\django\views\generic\base.py" in dispatch
  89.         return handler(request, *args, **kwargs)

File "myapp\lib\site-packages\django\views\generic\list.py" in get
  157.         context = self.get_context_data()

File "myapp\src\notices\views.py" in get_context_data
  18.         context = super(NotificationsListView, self).get_context_data(*args, **kwargs)

File "myapp\lib\site-packages\django\views\generic\list.py" in get_context_data
  119.             paginator, page, queryset, is_paginated = self.paginate_queryset(queryset, page_size)

File "myapp\lib\site-packages\django\views\generic\list.py" in paginate_queryset
  69.             page = paginator.page(page_number)

File "myapp\lib\site-packages\django\core\paginator.py" in page
  65.         number = self.validate_number(number)

File "myapp\lib\site-packages\django\core\paginator.py" in validate_number
  43.         if number > self.num_pages:

File "myapp\lib\site-packages\django\utils\functional.py" in __get__
  36.         res = instance.__dict__[self.name] = self.func(instance)

File "myapp\lib\site-packages\django\core\paginator.py" in num_pages
  95.         if self.count == 0 and not self.allow_empty_first_page:

File "myapp\lib\site-packages\django\utils\functional.py" in __get__
  36.         res = instance.__dict__[self.name] = self.func(instance)

File "myapp\lib\site-packages\django\core\paginator.py" in count
  90.             return len(self.object_list)

Exception Type: TypeError at /notices/
Exception Value: object of type 'User' has no len()

标签: djangodjango-class-based-viewspaginator

解决方案


get_queryset应该返回一个queryset而不是一个object

还有另一种方法被调用get_object,它返回一个对象。


推荐阅读