我有以下 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)
现在我想添加一个模型来管理存档的(早于今天的)事件。
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)
但如果我尝试这样做,我会得到 AlreadyRegistered 异常。
为什么我不能用相同的模型实现另一个 ModelAdmin,我怎样才能获得相同模型的不同管理 View ?
我知道我可以在我的类中实现自定义 list_filter
,但我想将不同页面中的内容分开。
最佳答案
使用代理模型:
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()
现在,您可以注册 2 个模型而无需覆盖 ModelAdmin.queryset
方法:
class EventAdmin(admin.ModelAdmin):
# ModelAdmin config
admin.site.register(ActiveEvent, EventAdmin)
admin.site.register(ArchiveEvent, EventAdmin)
您可以阅读有关 proxy models 的模式和 managers在文档中。
另外,使用这个:
queryset = super(EventArchiveAdmin, self).queryset(request)
作为第一个参数 super()
采用 current 类。参见 doc
注意django在django==1.7中将Manager.get_query_set
重命名为Manager.get_queryset
。
关于python - 为什么我不能用同一个模型注册多个 Django ModelAdmin?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12790220/