为什么我不能使用相同的型号注册多个Django ModelAdmin? [英] Why can't I register multiple Django ModelAdmin with same Model?

查看:437
本文介绍了为什么我不能使用相同的型号注册多个Django ModelAdmin?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下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。请参阅 doc

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?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆