首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >django分页页面中的不同记录数量

django分页页面中的不同记录数量
EN

Stack Overflow用户
提问于 2021-03-25 20:58:32
回答 1查看 64关注 0票数 1

我试图用不同的东西来分页,以最大化元素,在第一页(5)和所有其他页面(最多6)。我喜欢这个answer

代码语言:javascript
运行
复制
class MyPaginator(Paginator):

    def __init__(self, **kw):
        self.deltafirst = kw.pop('deltafirst', 0)
        Paginator.__init__(self, **kw)

    def page(self, number):
        number = self.validate_number(number)
        if number == 1:
            bottom = 0
            top = self.per_page - self.deltafirst
        else:
            bottom = (number - 1) * self.per_page - self.deltafirst
            top = bottom + self.per_page
        if top + self.orphans >= self.count:
            top = self.count
        return Page(self.object_list[bottom:top], number, self)


from django.core.paginator import Paginator
from django.core.paginator import EmptyPage
from django.core.paginator import PageNotAnInteger

class NewsView(ListView):
    model = News
    template_name="mysite/news.html"
    paginate_by =  5

    def get_context_data(self, **kwargs):
        context = super(NewsView, self).get_context_data(**kwargs) 
        all_news = News.objects.all().order_by("-date_news")
        paginator = MyPaginator(all_news, self.paginate_by,deltafirst=1)

        page = self.request.GET.get('page')

        try:
            file_exams = paginator.page(page)
        except PageNotAnInteger:
            file_exams = paginator.page(1)
        except EmptyPage:
            file_exams = paginator.page(paginator.num_pages)
        context['all_news'] = file_exams
        return context

但是我得到了一个错误,我不知道我做错了什么。错误本身

代码语言:javascript
运行
复制
    paginator = MyPaginator(all_news, self.paginate_by,deltafirst=1)
TypeError: __init__() takes 1 positional argument but 3 were given
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-25 21:15:28

首先在MyPaginator中更改您的__init__方法以修复错误:

代码语言:javascript
运行
复制
from math import ceil


class MyPaginator(Paginator):
    
    def __init__(self, *args, **kw):
        self.deltafirst = kw.pop('deltafirst', 0)
        super().__init__(*args, **kw)
    
    def page(self, number):
        number = self.validate_number(number)
        if number == 1:
            bottom = 0
            top = self.per_page - self.deltafirst
        else:
            bottom = (number - 1) * self.per_page - self.deltafirst
            top = bottom + self.per_page
        if top + self.orphans >= self.count:
            top = self.count
        return Page(self.object_list[bottom:top], number, self)

    @property
    def num_pages(self):
        if self.count == 0 and not self.allow_empty_first_page:
            return 0
        count = max(self.count - self.per_page + self.deltafirst, 0)
        hits = max(0, count - self.orphans)
        return 1 + ceil(hits / self.per_page)

接下来,为了使您的视图更简单,而不是覆盖get_context_data,覆盖get_paginator并将deltafirst设置为类属性:

代码语言:javascript
运行
复制
class NewsView(ListView):
    model = News
    template_name="mysite/news.html"
    paginate_by =  5
    paginator_class = MyPaginator
    deltafirst = 1
    
    def get_paginator(self, *args, **kwargs):
        if self.deltafirst:
            kwargs['deltafirst'] = self.deltafirst
        return super().get_paginator(*args, **kwargs)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66800010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档