J'utilise admin django pour générer le formulaire pour inclure des données dans la base de données, mais j'ai besoin de masquer certains champs de formulaire en fonction du groupe d'utilisateurs.

Donc, disons que j'ai un modèle tel que:

class Product(models.Model):
    name = models.CharField(...)
    description = models.CharField(...)
    approved = models.CharField(max_length=1, choices=(('y', 'yes'), ('n','no'), ('w', 'waiting'))

Là où je veux que l'utilisateur du groupe "basique" ne voit dans le formulaire que "nom" et "description" et l'utilisateur du groupe "avancé" voir aussi le statut "approuvé".

Dois-je utiliser un modèle personnalisé? Que vous disiez oui ou non, veuillez m'aider à me référer à certains documents ou à un exemple.

Je vous remercie.

0
Ale A 8 déc. 2011 à 16:44

3 réponses

Meilleure réponse

Vous pouvez remplacer la méthode get_form dans la classe ProductAdmin. De la méthode originale:

def get_form(self, request, obj=None, **kwargs):
    ....
    ....
    defaults = {
        "form": self.form,
        "fields": fields,
        "exclude": exclude,
        "formfield_callback": curry(self.formfield_for_dbfield, request=request),
    }
    defaults.update(kwargs)
    ...

Vous pouvez donc modifier dynamiquement self.form ou champs ou exclure

2
Alexey Savanovich 8 déc. 2011 à 14:31

Si vous souhaitez masquer des champs spécifiques uniquement, tout en autorisant les modifications, la solution minimale peut être d'ajouter vos utilisateurs administrateurs à un nouveau groupe et de réduire les champs en fonction de l'appartenance au groupe. Voici une classe réutilisable à intégrer:

class ExternalAdminModelAdmin(admin.ModelAdmin):
    external_admin_group = 'external_admin'
    hidden_fields = []

    def get_form(self, request, obj=None, **kwargs):
        self.fields = [field.name for field in Node._meta.local_concrete_fields if not field.name == 'id']

        if Group.objects.get(name=self.external_admin_group).user_set.filter(id=request.user.id).exists():
            for field_name in self.hidden_fields:
                self.fields.remove(field_name)

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

Il vous suffit de définir la propriété des champs masqués pour vos modèles:

@admin.register(MyModel)
class MyAdmin(ExternalAdminModelAdmin):
    hidden_fields = ['sensitive_field']
0
Dan Schien 26 févr. 2016 à 10:33

Vous pouvez fournir une méthode __init__ dans votre formulaire. Ici, vous aurez accès à l'objet utilisateur, s'il est présent. en fonction de l'appartenance à une équipe, vous pouvez personnaliser votre formulaire.

Quelques extraits:

Signature de la fonction et obtention de l'objet utilisateur:

 def __init__(self,*args, **kwargs):       
        self.user=None
        if kwargs:
            self.user = kwargs.pop('user')

Fonction pour vérifier si l'utilisateur est dans le groupe:

def is_user_in_group(user,group_name):
    return user.groups.filter(name=group_name).count() == 1

Extrait pour masquer un champ - cela ira dans votre méthode __init__:

self.fields['some_field_to_hide'].widget = widgets.HiddenInput

Je vais de mémoire ici, alors veuillez excuser les fautes de frappe.

1
Krystian Cybulski 8 déc. 2011 à 12:58