自定义form表单验证

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义form表单验证相关的知识,希望对你有一定的参考价值。

方式一:RegexValidator对象

from django.core.validators import RegexValidator

phone = fields.CharField(
    validators=[RegexValidator(r‘^[0-9]+$‘, ‘请输入数字‘), RegexValidator(r‘^159[0-9]+$‘, ‘数字必须以159开头‘)])   # 自定义验证规则进行验证


方式二:函数
from django.core.exceptions import ValidationError
 
def mobile_validate(value):
mobile_re = re.compile(r‘^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$‘)
if not mobile_re.match(value):
raise ValidationError(‘手机号码格式错误‘)
 
phone = fields.CharField(
validators=[mobile_validate,]) # 自定义验证规则进行验证



方式三:钩子函数
1,分析

技术分享技术分享

 

 技术分享

 

技术分享

 

通过上面分析1,通过_clean_fields实现
def _clean_fields(self):
for name, field in self.fields.items():
# value_from_datadict() gets the data from the data dictionaries.
# Each widget type knows how to retrieve its own data, because some
# widgets split data over several html fields.
if field.disabled:
value = self.get_initial_for_field(field, name)
else:
value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
try:
if isinstance(field, FileField):
initial = self.get_initial_for_field(field, name)
value = field.clean(value, initial)
else:
value = field.clean(value)
self.cleaned_data[name] = value
if hasattr(self, ‘clean_%s‘ % name):
value = getattr(self, ‘clean_%s‘ % name)()
self.cleaned_data[name] = value
except ValidationError as e:
self.add_error(name, e)


通过上面可以实现
def clean_phone(self):
# 去取用户提交的值:可能是错误的,可能是正确
value = self.cleaned_data[‘phone‘]
mobile_re = re.compile(r‘^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$‘)
if not mobile_re.match(value):
raise ValidationError(‘手机号码格式错误‘)

if models.UserInfo.objects.filter(phone=value).count():
raise ValidationError(‘手机号码已经存在‘)

return value


注意钩子字段只能取自己的。不然可能取不到。源码是通过__dict__取得
 

执行流程 1,正则表达式
     2,clean钩子函数
























































以上是关于自定义form表单验证的主要内容,如果未能解决你的问题,请参考以下文章

Django 和自定义表单验证

看用Tornado如何自定义实现表单验证

在自定义 Django 表单中验证和显示错误

在 HTML 5 中自定义表单/输入验证 [重复]

ant-design表单自定义验证

jquery表单验证 自定义函数使用