2010-08-16 8 views
8

Seguí this example y funciona muy bien pero me pregunto si puedo poner una excepción para que cuando esté en el administrador aparezcan todos los objetos (activos e inactivos). Esto podría ser simple pero no puedo encontrar cómo hacerlo en los documentos.¿Administrador personalizado para filtrar objetos en el sitio pero no en el administrador?

Esto es lo que mi jefe se parece ahora:

class ShareManager(models.Manager): 
    def get_query_set(self): 
     return super(ShareManager, self).get_query_set().filter(active=True) 

Respuesta

9

hay varias soluciones que vienen a la mente:

  1. definen lo queryset a utilizar para la lista de cambios con ModelAdmin.queryset().

  2. instale 2 administradores en su modelo, el primero que el administrador encuentre se usará como el predeterminado AFAIK.

    class SomeThing(models.Model): 
        objects = models.Manager() 
        shares = ShareManager() 
    
  3. añadir nuevo método en su gestor personalizado que devuelve las cosas sólo se activa y dejar get_query_set como está por defecto.

    class ShareManager(models.Manager): 
        def get_active_items(self): 
         return self.get_query_set().filter(active=True) 
    

Seguimiento

Creo que la solución más adecuada en su caso se combina # 1 y # 2 de variación.

Configure su administrador personalizado como objects para que todos puedan acceder a él (creo que esto debería funcionar para su problema de reusabilidad) y también instale el administrador predeterminado en su modelo y úselo en ModelAdmin.queryset().

class SomeThing(models.Model): 
     objects = ShareManager() 
     admin_objects = models.Manager() 

debería haber incluido ModelAdmin.queryset() método de ejemplo también, así que aquí está.

def queryset(self, request): 
     qs = self.model.admin_objects.get_query_set() 
     # TODO: this should be handled by some parameter to the ChangeList. 
     # otherwise we might try to *None, which is bad ;) 
     ordering = self.ordering or() 
     if ordering: 
      qs = qs.order_by(*ordering) 
     return qs 

Nota la línea qs = self.model.admin_objects.get_query_set() está trabajando con admin_objects que es la instancia del gestor de plano que incluye artículos publicados.

El resto de esta implementación del método queryset es la implementación predeterminada de Django que generalmente llama a qs = self.model._default_manager.get_query_set().

Espero que esto aclare un poco las cosas.

+0

Gracias por las múltiples soluciones, me está ayudando a comprender más. Un par de preguntas: Para el n. ° 1, ¿cómo obtengo todos los objetos como el conjunto de preguntas si dejo el Administrador personalizado en su lugar? # 2 y # 3 también funcionan, pero me encuentro con problemas cuando uso aplicaciones reutilizables como queryset = TaggedItem.objects.get_by_model (Share, tag). – knuckfubuck

+0

Me olvidé de poner un ejemplo del método 'queryset'. –

+0

Gracias por su seguimiento. La combinación funciona genial. – knuckfubuck

Cuestiones relacionadas