django-paginationでページング
djangoでページング用のライブラリというと、django-paginationがわりと使われるようですね。
http://www.djangopackages.com/grids/g/pagination/
使ってみたので基本の使い方をメモ
まず設定ファイルです。以下を追加します。
settings.py
TEMPLATE_CONTEXT_PROCESSORS += ('django.core.context_processors.request',) MIDDLEWARE_CLASSES += ('pagination.middleware.PaginationMiddleware',) INSTALLED_APPS += ('pagination', )
これで準備ok
あとはview関数で表示したいオブジェクトの一覧を返したらテンプレートの方で以下のように記述します。
{% load pagination_tags %} {% autopaginate object_list 12 %} {% for object in object_list %} {# 表示 #} {% endfor %} {% paginate %}
autopaginateに1ページ表示件数を渡せますが、渡さない場合は設定ファイルの値が使われます。
settings.py
PAGINATION_DEFAULT_PAGINATION = 10
この設定もしないとデフォルトで20件表示になるようです。
{% paginate %}では、インストールしたdjango-paginationに含まれている、templates/pagination/pagination.htmlが描画されます。
カスタマイズしたい場合はアプリのtemplates_dir以下に同じパスでhtmlファイルを置いておけばそちらが描画されます。
twitter bootstrapのpagination風のテンプレートを書いてみました
http://twitter.github.com/bootstrap/components.html#pagination
{% if is_paginated %} {% load i18n %} <div class="pagination"> <ul> {% if page_obj.has_previous %} <li><a href="?page={{ page_obj.previous_page_number }}{{ getvars }}{{ hashtag }}">{% trans "Prev" %}</a></li> {% else %} <li class="disabled"><span>{% trans "Prev" %}</span></li> {% endif %} {% for page in pages %} {% ifequal page page_obj.number %} <li class="active"><span>{{ page }}</span></li> {% else %} <li><a href="?page={{ page }}{{ getvars }}{{ hashtag }}">{{ page }}</a></li> {% endifequal %} {% endfor %} {% if page_obj.has_next %} <li><a href="?page={{ page_obj.next_page_number }}{{ getvars }}{{ hashtag }}">{% trans "Next" %}</a></li> {% else %} <li class="disabled"><span>{% trans "Next" %}</span></li> {% endif %} </ul> </div> {% endif %}