tutorial template superusuario modelos desde create crear cero python django

python - template - Django: especifique qué administrador de modelos debe usar el administrador de Django



django tutorial (3)

Creé un Administrador personalizado para un modelo de Django que devuelve un QuerySet que contiene un subconjunto de objects.all (). Necesito que este sea el administrador predeterminado del modelo, ya que también estoy creando una etiqueta personalizada que recuperará el contenido de cualquier modelo (especificado por un argumento), y necesita usar el administrador predeterminado para el modelo especificado. Todo eso funciona bien, excepto que Django Admin TAMBIÉN está utilizando el administrador predeterminado para este modelo en particular, lo que significa que no todas las instancias del modelo aparecen en el administrador.

Los documentos de Django no ayudan:

Si usa objetos personalizados de Administrador, tenga en cuenta que el primer Administrador que encuentra Django (en el orden en el que están definidos en el modelo) tiene un estado especial. Django interpreta este primer Manager definido en una clase como el Administrador "predeterminado", y varias partes de Django ( aunque no la aplicación de administración ) usarán ese Administrador exclusivamente para ese modelo. (Documentación de Django Managers)

Se supone que el administrador no debe usar el administrador predeterminado, pero parece estar en mi caso. Tenga en cuenta que también he agregado explícitamente los objects administrador predeterminados:

subset = CustomManager() # the default manager objects = models.Manager() # the one I want admin to use

¿Cómo puedo especificar qué administrador debería usar el administrador?


Código actualizado:

def get_queryset(self, request): """ Returns a QuerySet of all model instances that can be edited by the admin site. This is used by changelist_view. """ qs = self.model._default_manager.get_queryset() # TODO: this should be handled by some parameter to the ChangeList. ordering = self.get_ordering(request) if ordering: qs = qs.order_by(*ordering) return qs

_default_manager puede ser reemplazado ...


Como esperamos que los objects sean el único administrador, el administrador usará el manager en self.Admin.manager .

Desde el ticket https://code.djangoproject.com/ticket/4754 abierto por troy.simpson

class filterManager(models.Manager): def get_query_set(self): return super(filterManager, self).get_query_set().filter(name=''troy'') class Blah(models.Model): name = models.CharField(maxlength=100) objects = filterManager() class Admin: manager = filterManager()

Probado con Django 1.11


Puede elegir el administrador anulando el método queryset en su subclase ModelAdmin.

def get_queryset(self, request): # use our manager, rather than the default one qs = self.model.objects.get_queryset() # we need this from the superclass method ordering = self.ordering or () # otherwise we might try to *None, which is bad ;) if ordering: qs = qs.order_by(*ordering) return qs