Djangoの管理画面の一覧表示でページング(ページネーション)表示がありますが、あれを通常のページで使う方法です。
django.contrib.admin.views.main.ChangeListオブジェクトを管理画面で使っているのですが、これのモックを作って使ってみました。
Djangoのバージョンは1.1.2と1.2.1で確認しました。
urls.py
from django.conf.urls.defaults import * urlpatterns = patterns('', url(r'^$', 'myapp.views.index'), )
myapp/views.py
#coding:utf-8 from django.utils.http import urlencode from django.core.paginator import Paginator, InvalidPage class ChangeListMock(object): """ admin_listタグセットのpaginationタグを利用するためのChangeListのモッククラス """ show_all = True can_show_all = False multi_page = True def __init__(self, objects, list_per_page, page_num, full_result_count=None, opts=None): self.objects = objects self.list_per_page = list_per_page try: self.page_num = int(page_num) except ValueError: self.page_num = 0 self.opts = opts self.paginator = Paginator(self.objects, self.list_per_page) self.result_count = self.paginator.count try: self.result_list = self.paginator.page(self.page_num+1).object_list except InvalidPage: self.result_list = () if full_result_count is None: self.full_result_count = len(objects) else: self.full_result_count = full_result_count def get_query_string(self, new_params=None): if new_params is None: new_params = {} return '?%s' % urlencode(new_params) ###### from django.views.generic.simple import direct_to_template class MyPerson(object): def __init__(self, name, age): self.name = name self.age = age def index(request): # 適当なオブジェクトをいっぱい作成 objects = [MyPerson('foo%d' % i, i) for i in range(100)] opts = {'verbose_name': u'人', 'verbose_name_plural': u'人'} cl = ChangeListMock(objects, 5, request.GET.get('p', 0), opts=opts) return direct_to_template(request, 'index.html', {'cl': cl})
optsにはModel._metaを指定しても可。
myapp/templates/index.html
{% load admin_list adminmedia %} <html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <title>ChangeListMock</title> <link href="{% admin_media_prefix %}css/base.css" rel="stylesheet" type="text/css" media="all" /> <link href="{% admin_media_prefix %}css/changelists.css" rel="stylesheet" type="text/css" media="all" /> </head> <body> <div id="changelist"> <table> <tr> <th>name</th> <th>age</th> </tr> {% for object in cl.result_list %} <tr> <td>{{ object.name }}</td> <td>{{ object.age }}</td> </tr> {% endfor %} </table> {% pagination cl %} </div> </body> </html>
changelistのスタイルで表示してみることにします。