只需from django.core.paginator import Paginator 并在主页视图中将分页器对象设置为p = Paginator(thestuff, 7),在其他任何地方创建p = Paginator(thestuff, 10)。然后在任何一种情况下,在用于呈现模板的上下文中绑定 p。 p.object_list 在任何一种情况下都会被适当地设置(你似乎说这就是你正在使用的方法,对吧?也就是说,这就是你所说的“Django's object_list”的意思吗?)。
Django docs 有很好的细节和示例(假设您使用的是 1.0 或更高版本)。如果你不能让它工作,你能告诉我们(一个仍然失败的简化版本)你的模板和视图代码吗?
编辑:问题现在已经很清楚了,我认为应该通过子类化 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,示例显示了 Django 自己的用法,除了在创建它时,使用额外的命名参数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)