2012-10-08 38 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

使用代理模式:

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) 

可以約proxy modelsmanagers在文檔閱讀模式。

此外,使用這樣的:

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

作爲第一個參數super()採取當前類。見doc

注:的Django Django的== 1.7已更名爲Manager.get_query_setManager.get_queryset

+0

謝謝,顯然原來的代碼是正確的:) – Luca

相關問題