2 votes

comment changer le champ du formulaire dans la méthode is_valid()

J'ai deux modèles

class Friend(models.Model):
       me = models.ForeignKey(User)
       friend = models.ForeignKey(User)
       remark = models.CharField(max_length=15)

      def __unicode__(self):
            return self.remark

class Message(models.Model):
       from_user = models.ForeignKey(User)
       to_user = models.ForeignKey(User)
       ...

Je fais un formulaire pour Message

class MessageForm(ModelForm):
        class Meta:
              model = Message

mais quand j'affiche le formulaire en html, j'espère que j'affiche la liste de choix de to_user juste par 'remark' ( dans Friend model)

et je surcharge le MessageForm's init méthode comme la suivante :

class MessageForm(ModelForm):
        class Meta:
              model = Message
        def __init__(self,*args,**kwargs):
              super(MessageForm, self).__init__(*args,**kwargs)
              init = kwargs.get('initial')
              if init:
                  if 'from_user' in init:
                       me = init['from_user']
                       self.fields['to_user'].queryset = Friend.objects.filter(me=me)

Quand les données sont postées, le form.is_valid() lève l'erreur : Impossible d'assigner "" : "Message.to_user" doit être une instance "User".

Je veux donc changer la valeur de self.fields['to_user'] avant l'appel de is_valid() :

def is_valid(self):
     # do something  to fix the problem
     super(MessageForm, self).is_valid()

0voto

stevejalim Points 6750

is_valid() appelle le clean() du formulaire, donc mettez votre hack là-dedans :

def clean(self):
    # hack hack hack, operating on self.cleaned_data

    return self.cleaned_data

0voto

Burhan Khalid Points 50578

Vous devez ModelChoiceField dans votre formulaire, qui se chargera de la recherche de la relation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X