2

Cette question peut également être formulée comme suit: "Comment modifier les attributs d'un formulaire CreateView généré?" J'utilise "CreateView" pour générer une vue et un formulaire associé dans Django 1.10. L'idée est qu'un utilisateur régulier (un enseignant) peut créer une instance du modèle uniquement comme lui-même mais qu'un utilisateur privilégié peut créer une instance et l'assigner à n'importe quel enseignant. Je voudrais utiliser la même vue/forme pour les deux.Désactiver le champ de formulaire dans CreateView de Django

Le modèle:

class Set(models.Model): 
    name = models.CharField(
     max_length=40, 
    ) 
    matter = models.ForeignKey(
     Matter, 
     on_delete=models.SET_NULL, 
     null=True, 
    ) 
    group = models.ForeignKey(
     Group, 
     on_delete=models.SET_NULL, 
     null=True, 
    ) 
    teacher = models.ForeignKey(
     Teacher, 
     on_delete=models.PROTECT, 
    ) 

Techniquement, il serait composé de remplissage de la forme avec le « maître » courant connecté et désactiver le champ à moins que l'utilisateur courant est privilégié. Je fais actuellement le réglage de la valeur initiale avec le code suivant, mais je ne sais pas comment empêcher les utilisateurs réguliers de modifier le champ "enseignant".

class SetCreate(LoginRequiredMixin, CreateView): 
    model = Set 
    fields = ('name', 'matter', 'group', 'teacher') 

    def get_initial(self): 
     return {'teacher': self.request.user.teacher.id} 

    # code to limit 'teacher' field editing 

Une autre option que j'ai essayé est de créer l'instance avec le droit « professeur », comme:

class SetCreate(LoginRequiredMixin, CreateView): 
    model = Set 
    fields = ('name', 'matter', 'group') 

    def form_valid(self, form): 
     form.instance.teacher = self.request.user.teacher 
     return super(SetCreate, self).form_valid(form) 

Il fonctionne bien, mais je ne peux pas l'utiliser pour modifier le champ « enseignant » par un privilège utilisateur.

Je sais qu'il existe l'attribut 'Field.disable' pour former des champs, mais je ne sais pas comment modifier les attributs des formulaires générés 'CreateView', si possible.

Une autre option consisterait à limiter les options dans la liste déroulante du formulaire, mais je ne sais pas comment le faire non plus.

Tout conseil incluant un point de vue différent est le bienvenu.

Répondre

2

En regardant le code, les vues d'édition génèrent un formulaire à get_form_class en fonction de la valeur de l'attribut fields. Cela est défini comme un attribut de classe, mais le code le référence en fait via self.fields donc il n'y a aucune raison de ne pas pouvoir le remplacer au niveau de l'instance. Ainsi, vous pouvez le faire:

class SetCreate(LoginRequiredMixin, CreateView): 
    model = Set 
    fields = ('name', 'matter', 'group') 

    def get_form_class(self, *args, **kwargs): 
     if self.request.user.has_the_right_permission(): 
      self.fields += ('teacher',) 
     else: 
      self.fields = self.fields 
     return super(SetCreate, self).get_form_kwargs(*args, **kwargs) 

(Le bloc autre apparemment inutile est d'assurer que nous fixons toujours une variable d'instance.)

+0

l'air bien, mais il serait utile que pour une forme d'édition, pas créer forme. En mode création, un utilisateur régulier définirait réellement un champ 'enseignant' mais seulement comme lui-même. Idéalement, il peut être résolu simplement en définissant l'attribut "désactivé" dans le champ "enseignant" au moment où le formulaire est généré, mais je ne sais pas quelle méthode remplacer pour le faire. – jjchico

+0

Vous faites cela avec le code 'form_valid' que vous avez montré ci-dessus, encore une fois dans un bloc if qui vérifie l'autorisation. –