2012-10-08 16 views
8

私は、次のModelAdminのを持っている:複数のDjango 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を実装できますが、別のページに分けて保存したいと思います。

答えて

18

プロキシを使用モデル:あなたがDOCにproxy modelsmanagersについてのモードを読み取ることができます

class EventAdmin(admin.ModelAdmin): 
    # ModelAdmin config 

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

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つのモデルを登録することができます。最初の引数は現在クラスを取るsuper()として

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

また、これを使用します。 DjangoはDjangoの== 1.7にManager.get_querysetManager.get_query_setに改名しました:doc

注を参照してください。

+0

ありがとう、明らかに元のコードは右です:) – Luca

関連する問題