前言
validators自带一些常用的验证器,也可以自己定义一个验证器。在验证某个字段的时候,可以传validators参数用来指定验证器,以下是一些常用的验证器
- MaxValueValidator:验证最大值。
- MinValueValidator:验证最小值。
- MinLengthValidator:验证最小长度。
- MaxLengthValidator:验证最大长度。
- EmailValidator:验证是否是邮箱格式。
- URLValidator:验证是否是URL格式。
- RegexValidator:正则表达式的验证器
RegexValidator 正则验证器
比如通过正则匹配手机号必须是纯数字,并且必须以132开头的手机号
tel = forms.CharField(validators=[
RegexValidator(r'[0-9]+', '手机号必须是纯数字'),
RegexValidator(r'^132', '手机号必须132开头'),
])
校验URL
URLValidator 验证是否是 URL中的 slug,什么是slug?
你将如何用一个URL引用这个对象,用一个有意义的名字?您可以使用Article.id使URL如下所示:
> www.example.com/article/23
或者,你可以这样引用标题:
> www.example.com/article/The 46 Year Old Virgin
问题是,空格在URL中无效,它们需要被%20替换,这很难看,如下所示:
www.example.com/article/The%2046%20Year%20Old%20Virgin
这不是解决我们有意义的网址。这不是更好吗:
> www.example.com/article/the-46-year-old-virgin
这就是 slug. 所有字母都用小写字母,空格用连字符替换
$slug = url_title($this->input->post('title'), 'dash', TRUE);
用于将字符串 中的所有空格替换成连接符(-),并将所有字符转换为小写。 这样其实就生成了一个 slug ,可以很好的用于创建 URI 。
在form表单中验证slug
username = forms.CharField(label="URL",
validators=[validators.validate_slug],
error_messages={'required': '不能为空',})
validators.validate_slug 在validators源码中可以看到
slug_re = _lazy_re_compile(r'^[-a-zA-Z0-9_]+')
validate_slug = RegexValidator(
slug_re,
# Translators: "letters" means latin letters: a-z and A-Z.
_("Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."),
'invalid'
)
校验失败的时候,在页面上的提示语是:Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.
可以在error_messages中定义'invalid'不合法时,中文提示语
username = forms.CharField(label="URL",
validators=[validators.validate_slug],
error_messages={'required': '不能为空',
'invalid': '输入参数不合法'})
EmailValidator
EmailField 邮箱字段会自带校验邮箱格式
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
username = forms.EmailField(required=True,
label="邮箱",
error_messages={
'required': '用户名不能为空',
'invalid': '格式不合法'
})
CharField 也可以添加邮箱校验:validators.validate_email
username = forms.CharField(label="Email",
validators=[validators.validate_email],
error_messages={'required': '不能为空',
'invalid': '邮箱格式不合法'})
也可以使用 EmailValidator 验证是否是邮箱格式,跟上面实际上是等价的,在validators源码中可以看到
validate_email = EmailValidator()
使用 validators.EmailValidator() 校验
username = forms.CharField(label="Email",
validators=[validators.EmailValidator()],
error_messages={'required': '不能为空',
'invalid': '邮箱格式不合法'})
validate_integer 校验整数
validators.validate_integer 可以校验输入的整数
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
username = forms.CharField(label="username",
validators=[validators.validate_integer],
error_messages={'required': '不能为空',
})
validators.validate_integer 方法在validators中源码,实际上也是正则匹配的
integer_validator = RegexValidator(
_lazy_re_compile(r'^-?d+'),
message=_('Enter a valid integer.'),
code='invalid',
)
def validate_integer(value):
return integer_validator(value)