2012-07-24 48 views
0

我创建了自定义clean()方法的模型表单。但是这个clean()方法不再适用了,因为我无法在QueryDict中找到数据,所以我创建了一个不适用于该模型的formset。那么现在该怎么做才能使它工作(在formset QueryDict中查找与该表单相关的数据)?Django Formsets:会员形式干净的方法不工作?

这是会员形式:

class option_form(ModelForm): 
    class Meta: 
     model = option 
     exclude = ('warval','user') 

    def clean_value(self): 
     self.data = self.data.copy() 
     print(self.data) 
     if self.data['value']=='[email protected]': 
      raise forms.ValidationError("This can't be your email address") 

     return self.data['value'] 

这是错误:

Exception Type: MultiValueDictKeyError 
Exception Value: "Key 'value' not found in <QueryDict: {u'form-1-value': [u''], u'form-INITIAL_FORMS': [u'1'], u'form-TOTAL_FORMS': [u'2'], u'form-MAX_NUM_FORMS': [u''], u'form-0-id': [u'1'], u'form-1-id': [u''], u'csrfmiddlewaretoken': [u'e645de635fe47559ac540eb32ea4d08d'], u'form-0-value': [u'[email protected]']}>" 
+0

一些示例代码可以帮助隔离问题。 – danihp 2012-07-24 12:01:25

+0

在访问清洁属性之前,你是否调用超级清洁方法?类似_super(MyModelForm,self).clean()_ – Rohan 2012-07-24 12:04:27

+0

不,我没有调用任何超级干净的方法。 – 2012-07-24 12:10:28

回答

2

在你clean_value方法,你应该从self.cleaned_data,不self.data获取价值。有关示例,请参阅cleaning a specific field attribute上的文档。

self.data是您初始化表单时使用的原始POST或GET数据。它不包含名为value的密钥,因为密钥为prefixed,其值为form-0-

试着改变你的清洁方法如下:

def clean_value(self): 
    value = self.cleaned_data['value'] 
    if value == '[email protected]': 
     raise forms.ValidationError("This can't be your email address") 
    return value 
+0

非常感谢。:) – 2012-07-24 12:30:52

+0

不客气:) – Alasdair 2012-07-24 12:31:39