Django1.1でModelAdminにページを追加する

Django1.1ではadminアプリが大幅に改善され、拡張が1.0に比べて容易になりました。
ModelAdminにページを追加する場合は、ビューをメソッドとして追加しておき、get_urlsでurlpatternsにURLを追加します。

guestbookアプリのadmin.py

# coding:utf8
from django.core.exceptions import PermissionDenied
from django.contrib import admin
from django.views.generic.simple import direct_to_template

from models import Greeting

class GreetingAdmin(admin.ModelAdmin):
    def my_view(self, request):
        """
        新たに追加するビュー
        """
        # パーミッションのチェック
        # とりあえず変更パーミッションで
        if not self.has_change_permission(request):
            raise PermissionDenied

        opts = self.model._meta
        # adminサイトのデザインに合わせるならコンテキストが必要
        return direct_to_template(request, 'admin/mypage.html', {
            'title': u'マイページ',
            'opts': opts,
            'media': self.media,
            'app_label': opts.app_label,
        })

    def get_urls(self):
        """
        urlsプロパティで使われる
        urlを追加するためにオーバーライドします
        """
        from django.conf.urls.defaults import *

        # urlpatternsにURLを追加する
        # このパターンでModelAdminの場合は
        # 元のurlpatternsよりも先に追加しないと解決されない
        urlpatterns = patterns('',
            url(r'^mypage/$', self.my_view, name='mypage'),
        ) + super(GreetingAdmin, self).get_urls()

        return urlpatterns

    class Meta:
        model = Greeting

admin.site.register(Greeting, GreetingAdmin)

adminのデザインに合わせると結構コンテキストが必要になるので、このあたりは改善の余地ありかも。

templates/admin/mypage.html

{% extends "admin/change_list.html" %}
{% load i18n webdesign %}

{% block breadcrumbs %}
<div class="breadcrumbs">
  <a href="../../">
    {% trans "Home" %}
  </a>
   &rsaquo; 
   <a href="../">
     {{ app_label|capfirst }}
  </a>
  &rsaquo; 
  {{ title|capfirst }}
</div>
{% endblock %}

{% block content %}
<p>
{% lorem 3 %}
</p>
{% endblock %}

パンくずリストはadminのテンプレートからコピーして少し編集した。あんまりスマートじゃない。
それでも1.0のころに比べるとかなりマシ。

実際の表示