2010-06-01 3 views
1

J'utilise l'admin de django pour permettre aux utilisateurs de gérer les instances de modèle d'un modèle spécifique. Chaque utilisateur doit pouvoir gérer uniquement ses instances de modèle. (sauf pour les administrateurs qui devraient tout gérer).Filtrage des instances de modèle basé sur l'utilisateur dans l'administrateur django

Comment filtrer les objets dans la liste des modifications de l'administrateur?

Pensées:

  • je suppose que serait l'approche la plus élégante d'utiliser Object-level permissions. Quelqu'un est-il au courant d'une implémentation de cela?
  • Est-il possible de le faire en surchargeant la vue de l'administrateur en utilisant ModelAdmin.changelist_view?
  • Est-ce que list_select_related a quelque chose à voir avec ça?

Répondre

7

Vous pouvez remplacer afficher uniquement les éléments d'un utilisateur de queryset -method l'administrateur:

def queryset(self, request): 
     user = getattr(request, 'user', None) 
     qs = super(MyAdmin, self).queryset(request) 
     if user.is_superuser: 
      return qs 
     return qs.filter(user=user) 

En outre, vous devriez aussi prendre soin de les has_change_permission et has_delete_permission -méthodes, par exemple comme:

def has_delete_permission(self, request, obj=None): 
     if not request.user == obj.user and not request.user.is_superuser: 
      return False 
     return super(MyAdmin, self).has_delete_permission(request, obj) 

Idem pour has_change_permission! list_select_related est seulement utilisé lors de l'obtention de la requête de l'administrateur pour obtenir également des données connexes hors de relations immédiatement, pas quand il est nécessaire! Si votre but principal est seulement de restreindre un utilisateur à ne pas pouvoir travailler avec les objets des autres, l'approche ci-dessus fonctionnera, si cela devient plus compliqué et que vous ne pouvez pas attribuer des permissions à UN attribut, comme un utilisateur, Jetez un coup d'œil sur la proposition de django pour les permissions au niveau de la ligne!

+1

Votre première paix de code a bien fonctionné. Je l'ai également trouvé ici: http://www.ibm.com/developerworks/opensource/library/os-django-admin/index.html – Jonathan

Questions connexes