管理画面で使われているページング表示を通常のページで使う

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のスタイルで表示してみることにします。