Why can't I register multiple Django ModelAdmin with the same model?

I have the following ModelAdmin:

class EventAdmin(admin.ModelAdmin): # ModelAdmin config def queryset(self, request): queryset = super(EventAdmin, self).queryset(request) return queryset.exclude(date_end__lt=date.today()) admin.site.register(Event, EventAdmin) 

Now I want to add a model for managing archived (older than today) events.

 class EventArchiveAdmin(admin.ModelAdmin): # ModelAdmin config def queryset(self, request): queryset = super(EventArchiveAdmin, self).queryset(request) return queryset.filter(date_end__lt=date.today()) admin.site.register(Event, EventArchiveAdmin) 

But if I try to do this, I get an AlreadyRegistered exception.

Why can't I implement another ModelAdmin with the same model and how can I get different admin views of the same model?

I know that I can implement a custom list_filter in my class, but I would like things to be shared on different pages.

+8
python django django-models django-admin
source share
1 answer

Use proxy models:

 class Event(db.Model): ... class ActiveEventManager(models.Manager): def get_queryset(self): return super(ActiveEventManager, self).get_queryset().filter(active=True) class ActiveEvent(Event): class Meta: proxy = True objects = ActiveEventManager() class ArchiveEventManager(models.Manager): def get_queryset(self): return super(ArchiveEventManager, self).get_queryset().filter(active=False) class ArchiveEvent(Event): class Meta: proxy = True objects = ArchiveEventManager() 

Now you can register 2 models without overriding the ModelAdmin.queryset method:

 class EventAdmin(admin.ModelAdmin): # ModelAdmin config admin.site.register(ActiveEvent, EventAdmin) admin.site.register(ArchiveEvent, EventAdmin) 

You can read the proxy mode and managers mode in the document.

Also use this:

 queryset = super(EventArchiveAdmin, self).queryset(request) 

As the first argument to super() take the current class. See doc

Note: django renamed Manager.get_query_set to Manager.get_queryset as django == 1.7.

+18
source share

All Articles