ほんじゃらねっと

ダイエット中プログラマのブログ

djangoでページング

djangoのマニュアルでは探しきれなかったけど、ページングライブラリがあるようだ。

django.core.paginator.ObjectPaginator


でも少し機能が少ないようだったので探してみると、Django snippetsにいくつか登録されていた。


使いやすそうなBetterPaginatorというのを使ってみる。
http://www.djangosnippets.org/snippets/219/
http://www.djangosnippets.org/snippets/220/


簡単にできた。


url.py

...
urlpatterns = patterns('',
(r'^shohin/list/$', 'testapp.main.views.shohin_list'),
(r'^shohin/list/p(?P<page>\d+)/$', 'testapp.main.views.shohin_list'),
)
...


views.py

...
def shohin_list(request, page=1):
shohins = Shohin.objects.all()
shohin_count = shohins.count()
pager = BetterPaginator(shohins, 30, "/shohin/list/p%d/", shohin_count)
pager.set_page(page)
return render_to_response('list.html', {'pager': pager})
...


templates/list.html

...
<table>
<tr>
<th>コード</th>
<th>品名</th>
<th>単価</th>
</tr>
{% for shohin in pager.get_page %}
<tr>
<td>{{ shohin.code }}</td>
<td>{{ shohin.name }}</td>
<td>{{ shohin.tanka }}</td>
</tr>
{% endfor %}
</table>
<div>
<!-- http://www.djangosnippets.org/snippets/220/ ほぼそのまま -->
{% if pager.has_previous_page %}
<a class="paginator arrow" href="{{ pager.previous_link }}">&#171;</a>
{% else %}
<span class="paginator disabled arrow">&#171;</span>
{% endif %}
{% for set in pager.windowed_page_links %}
{% if not forloop.first %}...{% endif %}
{% for p in set %}
{% if p.2 %}
<span class="paginator current_page">{{ p.0 }}</span>
{% else %}
<a class="paginator" href ="{{ p.1 }}">{{ p.0 }}</a>
{% endif %}
{% endfor %}
{% endfor %}
{% if pager.has_next_page %}
<a class="paginator arrow" href="{{ pager.next_link }}">&#187;</a>
{% else %}
<span class="paginator disabled arrow">&#187;</span>
{% endif %}
</div>


とりあえずこれで十分使えそう。
Django snippetsは良い。