问题描述
我有以下ModelAdmin:
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 to manage 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 so I get AlreadyRegistered exception.
为什么我不能实现另一个ModelAdmin与同一个模型,我如何得到不同的管理员视图相同的模型?
Why can't I implement another ModelAdmin with same Model and how can I get different admin views of the same model?
我知道我可以实现一个自定义的 list_filter
我的班级,但我想把事情分开在不同的页面。
I know I can implement a custom list_filter
in my class but I'd like to keep things separated in different pages.
推荐答案
使用代理模型:
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
方法:
Now, you can register 2 models without override ModelAdmin.queryset
method:
class EventAdmin(admin.ModelAdmin):
# ModelAdmin config
admin.site.register(ActiveEvent, EventAdmin)
admin.site.register(ArchiveEvent, EventAdmin)
您可以阅读关于和在文档中。
You can read mode about proxy models and managers in the doc.
另请使用:
queryset = super(EventArchiveAdmin, self).queryset(request)
作为第一个参数 super()
take current class。请参阅
As first argument super()
take current class. See doc
注意: django已在django中将 Manager.get_query_set
重命名为 Manager.get_queryset
1.7。
Note: django has renamed Manager.get_query_set
to Manager.get_queryset
in django==1.7.
这篇关于为什么我不能使用相同的型号注册多个Django ModelAdmin?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!