# -----------------Form表单的钩子函数------------------
# 全局钩子函数: 可以拿到所有的已经验证字段的值
# 重新父类的clean方法可以做到全局验证,因为Form对象循环校验所有字段后会执行一次clean()方法 在clean()中可以对所有字典再做一次校验
def clean(self):
''''''
for k,v in self.cleaned_data.items():
print(k,v)
if re.search(r'haha', str(v)):
# 将错误信息添加到self._errors中字典中 k对应字段名, 后面填错误信息
self.add_error(k,'信息中包含haha 不合法')
raise ValidationError('信息中包含haha 不合法')
else:
return self.cleaned_data
# 局部钩子函数:只能拿到已经验证的当前字段以及之前的字段的值(因为Form是按顺序循环验证的 for k,v in self.fileds.items():)
# 当每个字段调用完clean()方法时还会 调用hasattr(clean_%s,字段名)
# 添加新方法 def clean_字段名(self)
def clean_username(self):
'''校验成功则返回成功后的用户名, 失败则将错误信息添加到_errors字典中 等同于返回None
然后cleaned__data中对应字段的数据会变为 cleaned_data[字段名] = None
'''
username = self.cleaned_data.get('username')
if username.startswith('s'):
raise ValidationError('用户名不能以s开头') # 当抛出异常时,django内部会捕获异常 然后调用self.add_error(当前字段名,错误信息) 添加进错误字典里
else: return username (或者 新的值)
注意:
在局部钩子函数里抛出异常会将错误信息添加到对应字段上{'字段名':‘错误信息’}
在全局钩子函数里抛出异常默认会将错误信息添加到全局错误信息上{'__all__':'错误信息'’} ,所以在全局钩子函数里应该自行调用self.add_error将错误信息添加到对应
字段上
# ORM中把一个对象转换成字典格式
from django.forms import model_to_dict book_obj = models.Book.objects.filter(id=edit_id).first() book_dict = model_to_dict(book_obj)