pythonを勉強中 vol.8

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 template

register = template.Library()

@register.inclusion_tag(‘test/pagination.html’)
def pagination(paginator, page):
 allpage = paginator.pages

 return {
  ’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

を使う事になるだろうなぁ〜。

ソースコードを見ても全然解る範囲だったので、
色々と試してみたいっすね。

投稿者:

kishir

趣味: sk8, ピスト、ターンテーブル、レコード 仕事: Python, Objective-C, PHP, JavaScript

2 thoughts on “pythonを勉強中 vol.8”

  1. いや〜参考にさせてもらってます!
    なんせセンスが違うのでw
    いつも見るたびにかっけなぁ〜って
    関心してますよぉ〜。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です