为什么我不能使用相同的模型注册多个Django ModelAdmin?

Luc*_*uca 9 python django django-models django-admin

我有以下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)
Run Code Online (Sandbox Code Playgroud)

现在我想添加一个模型来管理存档(比今天更早)的事件.

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)
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试这样做,我会得到AlreadyRegistered异常.

为什么我不能使用相同的模型实现另一个ModelAdmin,如何获得相同模型的不同管理视图

我知道我可以list_filter在课堂上实现一个自定义,但我想把东西分开放在不同的页面中.

def*_*fuz 19

使用代理模型:

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()
Run Code Online (Sandbox Code Playgroud)

现在,您可以注册2个模型而无需覆盖ModelAdmin.queryset方法:

class EventAdmin(admin.ModelAdmin):
    # ModelAdmin config

admin.site.register(ActiveEvent, EventAdmin)
admin.site.register(ArchiveEvent, EventAdmin)
Run Code Online (Sandbox Code Playgroud)

您可以在doc中阅读有关代理模型管理器的模式.

另外,使用这个:

queryset = super(EventArchiveAdmin, self).queryset(request)
Run Code Online (Sandbox Code Playgroud)

作为第一个参数super()采取当前的类.见文档

注意: django已在django == 1.7中重命名Manager.get_query_setManager.get_queryset.