刺身の上にたんぽぽ乗せる日記

プログラミングしたり、自販機の下に落ちてる小銭を集めたりしてます

djangoで独自の認証つきadminページの追加

調べても、ほとんどModelからAdminページを作る話ばかりで、完全にカスタマイズされたページで、認証だけ流用したい、という用途においては全然参考になるコードがなかったので、一応記録しておく。
http://docs.djangoproject.jp/en/latest/ref/contrib/admin/index.html
のAdding views to admin sites辺りにチラっと書いてあるんだけど、これだけじゃただurl追加しただけだった。

https://github.com/django/django/blob/master/django/contrib/admin/sites.py

のget_urlsの実装を見ればわかるけど、実際のページの処理をする関数に対して認証ページのwrapperをかけてる。

wrapする関数自体は直接触れないので、しょうがないからコピペしてみた。

class MyAdmin(admin.AdminSite):

    def get_urls(self):
        def wrap(view, cacheable=False):
            def wrapper(*args, **kwargs):
                return self.admin_view(view, cacheable)(*args, **kwargs)
            return update_wrapper(wrapper, view)

        patterns = super(MyAdmin, self).get_urls()
        patterns += urls.patterns(
            '',
            urls.url(r'^edit/$', wrap(self.editPage), name='edit'),
            )
        return patterns

urlpatternの登録は以下のとおり。

adminSite = MyAdmin()
urlpatterns = urls.patterns(
    '',
    urls.url(r'^admin/', urls.include(adminSite.urls)),
    )

これで、/admin/edit/などのページを開くと、ユーザ名を聞くようになる。

テンプレート側は、

{% extends "admin/base_site.html" %}

{% load i18n admin_static %}

{% block content %}
...
{% endblock content %}

こんな感じで見慣れたadminページのヘッダが表示される。