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 }}">« 前</a> {% else %} <span class="paginator disabled arrow">« 前</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 }}">次 »</a> {% else %} <span class="paginator disabled arrow">次 »</span> {% endif %} </div>
とりあえずこれで十分使えそう。
Django snippetsは良い。