2012-10-08 25 views
8

Tôi có ModelAdmin sau:Tại sao tôi không thể đăng ký nhiều Django ModelAdmin với cùng một Mô hình?

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) 

Bây giờ tôi muốn thêm một mô hình quản lý lưu trữ (lớn hơn ngày nay) các sự kiện.

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) 

Nhưng nếu tôi cố gắng làm như vậy tôi có được AlreadyRegistered ngoại lệ.

Tại sao tôi không thể triển khai ModelAdmin khác với cùng một Mô hình và làm cách nào để có được các chế độ xem quản trị khác nhau của cùng một kiểu máy?

Tôi biết tôi có thể triển khai list_filter tùy chỉnh trong lớp học của mình nhưng tôi muốn giữ mọi thứ được phân tách trong các trang khác nhau.

Trả lời

18

mô hình Sử dụng proxy:

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

Bây giờ, bạn có thể đăng ký 2 mô hình mà không ghi đè phương pháp ModelAdmin.queryset:

class EventAdmin(admin.ModelAdmin): 
    # ModelAdmin config 

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

Bạn có thể đọc chế độ về proxy modelsmanagers trong doc.

Ngoài ra, sử dụng này:

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

Như đối số đầu tiên super() mất hiện lớp. Xem doc

Lưu ý: django đã đổi tên Manager.get_query_set để Manager.get_queryset trong django == 1.7.

+0

Cảm ơn, rõ ràng mã gốc là đúng :) – Luca

Các vấn đề liên quan