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