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 %}