2016-03-10 3 views
1

Dans django, j'ai des superutilisateurs et des éditeurs de groupes de contenu. Lorsque je modifie un modèle en tant que superutilisateur, je veux pouvoir modifier tous les champs. Et si quelqu'un s'est connecté en tant qu'éditeur, je veux lui permettre de ne modifier que des champs spécifiques.Afficher un modèle d'administration différent list_display et des champs définis pour différents groupes d'utilisateurs

Je l'ai fait avec get_form méthode:

class VideoAdmin(admin.ModelAdmin):  
    editor_fields = ('description','description_rewrited') 

    def get_form(self, request, obj=None, **kwargs): 
     if not hasattr(request.user, 'perms_list'): 
      request.user.perms_list = request.user.groups.values_list('name',flat=True) 

     if 'video_description_rewriter' in request.user.perms_list: 
      print('rewrite fields to normal') 
      self.fields = self.normaluser_fields 

     return super(VideoAdmin, self).get_form(request, obj, **kwargs) 

Il fonctionne pour moi. Mais quand j'ouvre la vidéo pour l'éditer en tant qu'éditeur normal cela change les champs de superutilisateur réglés aux ensembles de champs d'éditeurs.

  1. modèle Open admin comme super-utilisateur - http://joxi.ru/zAN5wWMIVjz429
  2. modèle Open admin comme éditeur - http://joxi.ru/p27LJPZiDNgeA7
  3. Maintenant super-utilisateur a les mêmes champs défini comme éditeur - http://joxi.ru/L21jko5TW0ydAX

Je suppose qu'il ya une sorte de mise en cache de modèle?

Répondre

1

Vous définissez self.fields sur self.normaluser_fields lorsque l'utilisateur est éditeur, mais vous ne définissez pas self.fields sur la valeur par défaut lorsque l'utilisateur est admin. ModelAdmin objets sont créés au chargement de l'application et ils sont partagés entre tous les utilisateurs!

La modification de la valeur par défaut des champs lorsque l'administrateur passe à la page ne résout pas le problème à 100%. Lorsque l'administrateur et l'utilisateur non administrateur essaieront d'entrer la page d'édition en même temps, des conditions de concurrence pourraient se produire. Les deux peuvent avoir les mêmes champs.

Au lieu de Réécriture get_form, vous pouvez le faire par simple Réécriture get_fields méthode:

def get_fields(self, request): 
     if not hasattr(request.user, 'perms_list'): 
      request.user.perms_list = request.user.groups.values_list('name',flat=True) 

     if 'video_description_rewriter' in request.user.perms_list: 
      print('rewrite fields to normal') 
      return self.normaluser_fields 

     return self.fields 

Cette méthode ne remplace toutes les valeurs dans l'objet ModelAdmin, si le changement ne sera visible que pour un utilisateur.