gpt4 book ai didi

Django:在第一页上以不同的方式分页

转载 作者:行者123 更新时间:2023-12-01 09:39:57 24 4
gpt4 key购买 nike

目前,我正在使用 Django 的 object_list 来处理分页。如果您在听到我的问题后认为我需要它,我很乐意转到正确的 Paginator() 类:

在主页上,我想按 7 分页,但在所有其他页面上,我想按 10 分页。

我该怎么做呢?我真的无法理解它。我最接近让它工作的结果导致一整页的结果被遗漏了,所以显然我不希望这样。

我会非常感谢任何答案。如果您需要更多信息,请告诉我。非常感谢。

最佳答案

只需 from django.core.paginator import Paginator 并在主页 View 中创建一个分页器对象为 p = Paginator(thestuff, 7) p = Paginator(thestuff, 10) 其他地方。然后在任何一种情况下,在用于呈现模板的上下文中绑定(bind) pp.object_list 在任何一种情况下都会被适本地设置(你似乎说这就是你正在使用的方法,对吧?也就是说,这就是你所说的“Django's object_list”的意思吗?)。

Django docs有出色的细节和示例(假设您使用的是 1.0 或更高版本)。如果你不能让它工作,你能告诉我们(一个仍然失败的简化版本)你的模板和 View 代码吗?

编辑:问题现在已经很清楚了,我认为应该通过子类化 Django 的核心分页器来解决,如下所示:

from django.core.paginator import Paginator, Page

class MyPaginator(Paginator):

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

def page(self, number):
"Returns a Page object for the given 1-based page 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)

现在完全按照上面的文本和示例使用 MyPaginator,除了在创建它时,使用额外的命名参数 deltafirst=3 使首页 3 比正常的每页长度(10)。因此,您将使用标称长度为 10 但 deltafirst 为 3 的单个分页器,以使第一页 3 比所有其他页面短。

(validate_number 中可能存在问题,但我不确定它们是否会出现——如果出现了,那么 MyPaginator 也需要覆盖该方法。

最新版本的 Django 更新:

由于没有考虑位置参数,上述代码会出错,并且还需要覆盖 num_pages 以允许正确显示最后一页:

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 self._get_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)

关于Django:在第一页上以不同的方式分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1054981/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com