python测试开发django-105.form表单自带的一些校验(validators)

前言

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_]+\Z')
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+\Z'),
    message=_('Enter a valid integer.'),
    code='invalid',
)


def validate_integer(value):
    return integer_validator(value)

posted @ 2021-07-06 16:43  上海-悠悠  阅读(751)  评论(0编辑  收藏  举报