I have two models
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)
...
I make a form for Message
class MessageForm(ModelForm):
class Meta:
model = Message
but when i display the form in html, i hope i display to_user’s choice list just by ‘remark’ ( in Friend model)
and I override MessageForm ‘s init method like follow:
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)
well when the data post, the form.is_valid() raise error : Cannot assign “”: “Message.to_user” must be a “User” instance.
so i want to change self.fields[‘to_user’] ‘s value before is_valid() is call like:
def is_valid(self):
# do something to fix the problem
super(MessageForm, self).is_valid()
is_valid()calls theclean()method of the form, so put your hack in there: