====== 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)