Django (1.10) override AdminSite

前端 未结 3 1787
你的背包
你的背包 2021-01-02 04:25

I\'ve tried to override AdminSite class with my own custom class. I followed tutorial from django\'s documentation: https://docs.djangoproject.com/en/1.10/ref/contrib/admin

相关标签:
3条回答
  • 2021-01-02 04:50

    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
    ]
    
    0 讨论(0)
  • 2021-01-02 04:50

    I faced a similar problem. I used Django 2.1 and the hook from the comments above didn't work for me. And also I was not able to import GroupAdmin and UserAdmin, like so

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

    Importing GroupAdmin or UserAdmin broke the code for some reason. I was not able to define the exact reason.

    So my workaround was (in project/urls.py):

    from django.conf.urls import include, url
    from django.contrib.admin import site
    from project.admin import myadmin
    
    myadmin._registry.update(site._registry)
    
    urlpatterns = [
        url(r'^admin/', myadmin.urls),
        ]
    

    The idea here is to copy registered models from default admin site. Maybe it's not good to do so, but I could not find anything else working.

    0 讨论(0)
  • 2021-01-02 04:56

    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.

    0 讨论(0)
提交回复
热议问题