Django Admin サイトを Hack する方法
Django 1.8 時点の手順です。
アプリの設定
django_project/django_project/settings.py
# Application definition INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'django_app', # <-マイアプリを追加 )
マイ Admin サイトの定義
django_project/django_app/admin.py
# -*- coding: utf-8 -*- from django.contrib import admin from django.contrib.admin import AdminSite # AdminSite をインポート from django_app.models import * # AdminSite を継承した新しいクラスを定義 class MyAdminSite(AdminSite): pass my_admin_site = MyAdminSite(name='admin') class MyModelAdmin(admin.ModelAdmin): pass # MyModel は my_site に登録 my_admin_site.register(MyModel, MyModelAdmin)
URLディスパッチの設定
django_project/django_project/urls.py
from django.conf.urls import include, url from django.contrib import admin from django_app.admin import my_admin_site # <- マイ Admin サイトをインポート urlpatterns = [ #url(r'^admin/', include(admin.site.urls)), # マイ Admin サイトにディスパッチされるように設定 url(r'^admin/', include(my_admin_site.urls)), ]
これだけだとマイ Admin サイトにグループ、ユーザーが表示されなくなる
Django 1.7 から autodiscover() は django.contrib.admin の init.py で定義されて、django.contrib.admin.apps.AdminConfig が自動実行するようになった。
django/contrib/admin/__init__.py
def autodiscover(): autodiscover_modules('admin', register_to=site)
django/contrib/admin/apps.py
class AdminConfig(SimpleAdminConfig): """The default AppConfig for admin which does autodiscovery.""" def ready(self): super(AdminConfig, self).ready() self.module.autodiscover()
このままだと default admin site にしかグループ、ユーザーが autodiscover されないので、MyAdminSite にコピーすることにした。
django_project/django_app/admin.py
# -*- coding: utf-8 -*- from django.contrib import admin from django.contrib.admin import AdminSite # AdminSite をインポート from django_app.models import * # AdminSite を継承した新しいクラスを定義 class MyAdminSite(AdminSite): pass my_admin_site = MyAdminSite(name='admin') # autodiscover の結果をコピー my_admin_site._registry = admin.site._registry class MyModelAdmin(admin.ModelAdmin): pass # MyModel は my_site に登録 my_admin_site.register(MyModel, MyModelAdmin)