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