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