2009-10-30 21 views
15

Estoy tratando de definir una acción para un modelo de barra, pero solo quiero la lista de objetos de barra relacionados con un usuario Foo.¿Hay alguna forma de filtrar un queryset en el administrador de django?

Antes de comenzar a rebuscar en el código de administrador y pasar un conjunto de consulta personalizado (o escribir una vista personalizada que secuestra el soporte de múltiples casillas de verificación del administrador), pensé en verificar si había alguna manera de hacerlo segmenta los datos como están para obtener una vista de lista.

Nota: No estoy tratando de ordenar por usuario relacionado, y no estoy tratando de agregar opciones adicionales a la vista de lista predeterminada para filtrar por usuario; Necesito una URL específica o una vista que me dará solo una lista de objetos de barra a un usuario específico usuario Foo.

Respuesta

25

No está documentado, pero la vista de lista de cambios estándar acepta parámetros de filtros de conjunto de consultas normales como argumentos GET. Entonces usted puede hacer:

/admin/myapp/bar/?user__username=foo 
+0

Y la lista de posibilidades está aquí: https://docs.djangoproject.com/en/dev/ref/models/querysets/#field-lookups – AJP

25

Si está utilizando 1.1.x es realmente muy fácil de pasar en un conjunto de consulta personalizado. Todo lo que necesita hacer es anular el método queryset() en su ModelAdmin. Algo como esto:

class ThisAdmin(admin.ModelAdmin): 
    def queryset(self, request): 
     """ 
     Filter the objects displayed in the change_list to only 
     display those for the currently signed in user. 
     """ 
     qs = super(ThisAdmin, self).queryset(request) 
     if request.user.is_superuser: 
      return qs 
     return qs.filter(owner=request.user) 

En realidad, esto se puede hacer en la rama 1.0.x también, pero requiere un poco más código extra en su ModelAdmin.

La ventaja de este enfoque es que no satura las agradables y bonitas URL de administración (y también, por lo tanto, hace que sea extremadamente obvio para sus usuarios ver objetos de otras personas).

+2

Esto funciona bien para los modelos editados directamente en el administrador. ¿Qué hay de las claves foráneas que se auto llenan en los menús desplegables? –

+0

limit_choices_to = {} –

+2

'def queryset' es' def get_queryset' para todas las versiones recientes de Django. –

Cuestiones relacionadas