2011-12-24 34 views
2

我有兩個型號如何改變方法is_valid()

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表單,我希望我展示to_user的選擇列表只是「備註」(在朋友模型)

和我重寫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」必須是「User」實例。

,所以我想改變self.fields [「to_user」] is_valid前的值()調用是這樣的:

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

回答

0

is_valid()調用形式的clean()方法,所以把你砍在那裏:

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

    return self.cleaned_data 
+0

有比你想採取的方法更清潔/可以說更好的方法來做到這一點,但這會奏效。 – 2011-12-25 12:38:49

+0

[self._clean_fields()](https://code.djangoproject.com/browser/django/trunk/django/forms/forms.py#L270)將第一除[self.clean()](HTTPS撥打: //code.djangoproject.com/browser/django/trunk/django/forms/forms.py#L297)這是整個形式的方法,除了會在self._clean_fields()[self.clean(value)]( https://code.djangoproject.com/browser/django/trunk/django/forms/forms.py#L287) – ruandao 2011-12-27 00:28:49