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ページのヘッダが表示される。