我有两个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
答案 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
...