如何在方法中更改表单字段is_valid()

时间:2011-12-24 22:18:49

标签: django

我有两个型号

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)
       ...

我为消息

制作表格
class MessageForm(ModelForm):
        class Meta:
              model = Message

但是当我在html中显示表单时,我希望我只通过'remark'显示to_user的选择列表(在Friend模型中)

我覆盖了MessageForm的 init 方法,如下所示:

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)

当数据发布时,form.is_valid()引发错误:无法分配“”:“Message.to_user”必须是“用户”实例。

所以我想在is_valid()被调用之前更改self.fields ['to_user']的值:

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

2 个答案:

答案 0 :(得分:0)

is_valid()调用表单的clean()方法,所以把你的黑客放在那里:

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

    return self.cleaned_data 

答案 1 :(得分:0)

您的表单中需要ModelChoiceField,这将处理查找关系。