Django (1.10) override AdminSite

From myapp/admin.py:

from django.contrib.auth.models import Group, User
from django.contrib.auth.admin import GroupAdmin, UserAdmin
from django.contrib.admin import AdminSite
from django.contrib import admin

from .models import MyModel #This is my app's model

# Custom admin site
class MyAdminSite(AdminSite):
    site_header = 'My Project Title'
    site_title  = 'My Project Title Administration'
    index_title = 'My Project Title Administration'
    # You can add on more attributes if you need 
    # Check out https://docs.djangoproject.com/en/1.11/ref/contrib/admin/#adminsite-objects

# Create admin_site object from MyAdminSite
admin_site = MyAdminSite(name='my_project_admin')

# Register the models
class MyModelAdmin(admin.ModelAdmin):
    list_display = ('id', 'description')

admin_site.register(MyModel, MyModelAdmin)

# Create and register all of your models
# ....

# This is the default Django Contrib Admin user / group object
# Add this if you need to edit the users / groups in your custom admin
admin_site.register(Group, GroupAdmin)
admin_site.register(User, UserAdmin)

From myproject/urls.py

from django.conf.urls import url
from django.contrib import admin
from myapp.admin import admin_site ##! Important..Import your object (admin_site) instead of your class (MyAdminSite)

urlpatterns = [
    url(r'^admin/', admin_site.urls), #Now all /admin/ will go to our custom admin
]

I didn't found the solution to my problem, but I have made a workaround.

First we need to create module in our app (e.g. admin.py) and then extend class AdminSite:

from django.contrib.admin import AdminSite

class MyAdminSite(AdminSite):
    ...

Then on bottom of module we need to create instance of our MyAdminSite and register built-in models from Django:

site = MyAdminSite()
site.register(Group, GroupAdmin)
site.register(User, UserAdmin)

Necessary imports:

from django.contrib.auth.models import Group, User
from django.contrib.auth.admin import GroupAdmin, UserAdmin

In our site url module we need to override original site object:

from .admin import site

admin.site = site
admin.autodiscover()
...
url(r'^admin/', admin.site.urls)
...

Last change we need to do is register our models. One thing we need to remeber is that we can't use register as decorator like that:

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
    ...

or:

@admin.site.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
    ...

We need to define our ModelAdmin class and then call register on our MyAdminSite object:

class MyModelAdmin(admin.ModelAdmin):
    ...
admin.site.register(MyModel, MyModelAdmin)

This is the only solution that is working for me.

Tags:

Python

Django