python:django:django_admin_hack

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)),
]

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)
  • python/django/django_admin_hack.txt
  • 最終更新: 2019/08/19 07:03
  • by ともやん