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.
3 réponses
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
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']
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.
Questions connexes
De nouvelles questions
python
Python est un langage de programmation multi-paradigme, typé dynamiquement et polyvalent. Il est conçu pour être rapide à apprendre, comprendre, utiliser et appliquer une syntaxe propre et uniforme. Veuillez noter que Python 2 est officiellement hors support à partir du 01-01-2020. Néanmoins, pour les questions Python spécifiques à la version, ajoutez la balise [python-2.7] ou [python-3.x]. Lorsque vous utilisez une variante Python (par exemple, Jython, PyPy) ou une bibliothèque (par exemple, Pandas et NumPy), veuillez l'inclure dans les balises.