2012-10-08 13 views
8

Tengo el siguiente ModelAdmin:¿Por qué no puedo registrar varios Django ModelAdmin con el mismo modelo?

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) 

Ahora quiero añadir un modelo para gestionar archivado (mayores de hoy) eventos.

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) 

Pero si trato de hacerlo me sale AlreadyRegistered excepción.

¿Por qué no puedo implementar otro ModelAdmin con el mismo modelo y cómo puedo obtener vistas de administrador del mismo modelo?

Sé que puedo implementar un list_filter personalizado en mi clase, pero me gustaría mantener las cosas separadas en diferentes páginas.

Respuesta

18

modelos Uso de 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() 

Ahora, puede registrar 2 modelos sin mando ModelAdmin.queryset método:

class EventAdmin(admin.ModelAdmin): 
    # ModelAdmin config 

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

modo Usted puede leer sobre proxy models y managers en el doc.

Asimismo, el uso de este:

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

Como primer argumento super() tomar actual clase. Ver doc

Nota: Django ha cambiado el nombre a Manager.get_query_setManager.get_queryset en == Django 1.7.

+0

Gracias, obviamente, el código original es el correcto :) – Luca

Cuestiones relacionadas