9

私は次の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 を実装できないのはなぜですか? 同じモデルの異なる管理ビューを取得するにはどうすればよいですか?

クラスにカスタムを実装できることはわかっていますがlist_filter、別のページに分けておきたいと思います。

4

1 に答える 1

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()

ModelAdmin.querysetこれで、オーバーライドメソッドなしで 2 つのモデルを登録できます。

class EventAdmin(admin.ModelAdmin):
    # ModelAdmin config

admin.site.register(ActiveEvent, EventAdmin)
admin.site.register(ArchiveEvent, EventAdmin)

ドキュメントでプロキシ モデルマネージャーに関するモードを読むことができます。

また、これを使用します:

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

最初の引数として、現在のクラスsuper()を取得します。ドキュメントを参照

注: django はdjango==1.7 で名前が変更Manager.get_query_setされました。Manager.get_queryset

于 2012-10-08T22:15:29.663 に答える