Pythonをちょこちょこ書いていて、
やっぱDjangoのソースなんかも気になりだした。
vol.8は脱線して、
Djangoのソースを見てみる!
今作っているものでページャーを作りたかったので、
Paginatorを読んでみてみた。
Django/django/core/paginator.py
paginatorに用意されているメソッドは、
・validate_page_number
・get_page
・has_next_page
・has_previous_page
・first_on_page
・last_on_page
・hits
・pages
・page_range
がありました。
実際に使ったのは、
・pages
・has_next_page
・has_previous_page
のみですがw
今回作っているのがブログでして、
pateoさんのブログを見てこれはかっけぇ〜!
って思い、
1カラム、1記事で作ってますw
なので、
1つのページにページャーを
・next(次へ)
・previous(前へ)
的に出したかった。
今回はtemplatetagsを作りたかったので、
下記のように書きました。
#vim: fileencoding=utf-8 :
from urllib import quote
from django import templateregister = template.Library()
@register.inclusion_tag(‘test/pagination.html’)
def pagination(paginator, page):
allpage = paginator.pagesreturn {
’page’ : page,
’allpage’ : allpage,
’has_previous’ : paginator.has_previous_page(page),
’has_next’ : paginator.has_next_page(page),
’next’ : page + 1,
’previous’ : page – 1,
}
まず
allpage = paginator.pages
は実際にページの総数が返ってくる。
次に
paginator.has_previous_page(page)
は引数に現在のページ番号を渡すと
次のページがあるかをチェックするので、
TrueかFalseが返ってくる。
paginator.has_next_page(page)
も同じですね。
これは最初のページの場合は、
next(次へ)は出すが、previous(前へ)は出さないために
使いました。
最後のページの場合は逆ですね。
previous(前へ)は出すが、next(次へ)は出さない。
(実際はリンクのためのパスなんかも取得していて、
それもテンプレートに落とす事で簡単に処理させてます。)
後はテンプレートに落とし込んで終わり。
今回は、
ページのリンクを前後に1つしか出さなかったが、
複数出す場合なんかはすごい便利だなぁ〜と
思いました。
その場合は、
・first_on_page
・last_on_page
を使う事になるだろうなぁ〜。
ソースコードを見ても全然解る範囲だったので、
色々と試してみたいっすね。
やっぱ時代は1カラム1記事ですよねw
いや〜参考にさせてもらってます!
なんせセンスが違うのでw
いつも見るたびにかっけなぁ〜って
関心してますよぉ〜。