在学习ModelForm时遇到一个问题:
form.py中定义了clean_payment函数,用来对payment字段进行清洗。
views.py中验证表单v.is_valid()时就已自动执行上面的清洗函数,那后面再执行v.cleaned_data,岂不是重复清洗?
# form.py
#!!!!!!!!!! 注意这里是ModelForm !!!!!!!!!!
class VocationForm(forms.ModelForm):
class Meta:
...
# 自定义表单字段payment的数据清洗
def clean_payment(self):
data = self.cleaned_data['payment'] + 10
return data
# views.py
def index(request):
if request.method == 'GET':
...
else:
v = VocationForm(data=request.POST, prefix='vv')
# is_valid()会使字段payment自增加10
if v.is_valid():
...
if not result:
...
else:
d = v.cleaned_data # 这里不会再对字段payment自增加10吗?
d['title'] = '中级' + d['title']
result.update(**d)
return HttpResponse('修改成功')
else:
...
查询资料:Django 文档-表单与字段验证
What is the use of cleaned_data in Django
可知是我理解错了。在form.py中自定义的验证和清洗函数,或者默认的继承的清洗函数,都会在调用form.is_valid()方法时自动执行,而不是在调用form.cleaned_data时执行,form.cleaned_data只是一个存储去除了多余标签的数据的字典。