2010-04-11 17 views
5

Digamos que tengo un sitio donde los usuarios pueden agregar entradas a través del panel de administración. Cada Usuario tiene su propia Categoría de la que es responsable (cada Categoría tiene un Editor asignado a través de ForeingKey/ManyToManyField).Cómo filtrar queryset en changelist_view en django admin?

cuando el usuario añade la entrada, que limitar las opciones mediante el uso de EntryAdmin así:

class EntryAdmin(admin.ModelAdmin): 
    (...) 

    def formfield_for_foreignkey(self, db_field, request, **kwargs): 
     if db_field.name == 'category': 
      if request.user.is_superuser: 
       kwargs['queryset'] = Category.objects.all() 
      else: 
       kwargs['queryset'] = Category.objects.filter(editors=request.user) 
      return db_field.formfield(**kwargs) 
     return super(EntryAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) 

De esta manera puedo limitar las categorías a las que un usuario puede agregar entrada y funciona perfecto.

Ahora, la parte engañosa: en la página de lista/acción de cambio de entrada, quiero mostrar solo las entradas que pertenecen a la categoría de usuario actual. Traté de hacer esto utilizando este método:

def changelist_view(self, request, extra_context=None): 
     if not request.user.is_superuser: 
      self.queryset = self.queryset.filter(editors=request.user) 

Pero me sale este error:

AttributeError: 'function' object has no attribute 'filter'

Esto es extraño, porque pensé que debería ser un QuerySet típico. Básicamente, estos métodos son not well documented y cavar toneladas de código Django no es mi deporte favorito.

¿Alguna idea de cómo puedo lograr mi objetivo?

Respuesta

12

queryset es un método en ModelAdmin que devuelve un conjunto de preguntas. Debe anularlo en su clase EntryAdmin.

def queryset(self, request): 
    qs = super(EntryAdmin, self).queryset(request) 
    if request.user.is_superuser: 
     return qs 
    else: 
     return qs.filter(editors=request.user) 

Cambio de la queryset limitará las entradas mostradas en la vista de lista. También debe sobrescribir has_change_permission para asegurarse de que el usuario tenga permiso para editar el objeto en la página de edición de objetos individuales. Consulte la siguiente entrada en el blog de James Bennett para más detalles:

http://www.b-list.org/weblog/2008/dec/24/admin/

+0

queryset necesita ser filtrado por categoría. Pero hay un problema cuando el usuario tiene más de una categoría asignada. O tal vez me estoy perdiendo algo. – minder

Cuestiones relacionadas