晚期Formfield清理 - 在Form子类中清理Formfield

时间:2011-03-23 09:47:07

标签: django django-forms

我有两个ModelFields(Char和Decimal),用clean_formfield()方法单独清理它们是微不足道的。但是为了显示两个表单域,我想显示只有一个输入字段和ChoiceField,用户可以决定下一个输入是一些单词还是一个数字。拆分是必要的,因为我想稍后对数字进行一些汇总。

很明显,由于依赖性,我不能使用clean_formfield(),所以它必须进入表单清理器。问题是如何实现'晚期的Formfield清洁'?

class Input(models.Model):
   ...
   number = models.DecimalField()
   word = models.CharField()
   ...

class InputForm(forms.ModelForm):
   ...
   type = forms.CharField(widget=forms.RadioSelect(choices=(('word','Word'),('number','Number'),)))
   input = forms.CharField()
   ...
   def clean(self):
      cleaned_data = self.cleaned_data
      type = cleaned_data.get('type')
      input = cleaned_data.get('input')

    if type == 'number':           
        <<< clean_Decimal_Formfield >>>
        cleaned_data['number'] = input
        cleaned_data['word'] = None
    else:
        <<< clean_Char_Formfield >>>        
        cleaned_data['number'] = None
        cleaned_data['word'] = input

    return cleaned_data

2 个答案:

答案 0 :(得分:0)

我会坚持这个,1个模型字段= 1个表单字段。 如果您只需要保存一个字段(数字或文本),您可以根据无线电选择状态隐藏/显示两个字段(普通的js)

为了防止保存两个值而不是表单的清理,您可以检查是否只填充了一个字段,并且该字段与无线电选择兼容。

答案 1 :(得分:0)

没有必要为'Late FormField清洁'发明一种新方法!就这样做:

...
if type == 'number':           
    cleaned_data['number'] = input
    cleaned_data['word'] = None
else:
    cleaned_data['number'] = None
    cleaned_data['word'] = input
...