ホームページのビューのように、他のすべての場所でページfrom django.core.paginator import Paginator
付けオブジェクトを作成します。次に、どちらの場合も、テンプレートのレンダリングに使用するコンテキストでバインドします。どちらの場合も適切に設定されます(そして、それがあなたが使用しているアプローチだと言っているようですよね?つまり、それは「Djangoのobject_list」の意味ですか?)。p = Paginator(thestuff, 7)
p = Paginator(thestuff, 10)
p
p.object_list
Djangoのドキュメントには優れた詳細と例があります(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で、デルタファーストが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)