【问题标题】:Subclassing RegexValidator in Django does not work在 Django 中子类化 RegexValidator 不起作用
【发布时间】:2015-07-25 10:46:17
【问题描述】:

为了 DRY 和易用性,我想从 Django's RegexValidator 继承。

我试过了:

class UsernameValidator(RegexValidator):
    regex = r'^([a-zA-Z]{4}[\w]{1,16})$'
    message = 'Wrong username format.'
    code = 'invalid_format'

我以这种方式将此验证器添加到我的字段中:

class RegistrationForm(forms.Form):
    signup_username = forms.CharField(label='Username', max_length=20,
                                  validators=[UsernameValidator])

但如果我使用了错误的用户名(如123abc),验证器不会失败。 从RegexValidator继承的正确方法是什么?

我需要这个验证在几个点,这就是为什么我想要一个自己的验证器。

【问题讨论】:

    标签: django python-3.x django-validation


    【解决方案1】:

    创建 RegexValidator 的实例。

    validate_username = RegexValidator(regex=r'^([a-zA-Z]{4}[\w]{1,16})$',
                                       message = 'Wrong username format.',
                                       code = 'invalid_format')
    
    ...validators = [validate_username]...
    

    【讨论】:

      【解决方案2】:

      我编写了一个自己的函数,而不是继承 RegexValidator,这很有效。

      def validate_username(value):
          regex = r'^([a-zA-Z]{4}[\w]{1,16})$'
          if not re.match(regex, value):
              raise ValidationError('Wrong username format.')
      

      【讨论】:

      • 尽管如此,我仍然很好奇为什么我在我的问题中发布的方法不起作用。
      【解决方案3】:

      Validators 参数应该是一个可调用对象的列表 在你的情况下应该是

      validators=[UsernameValidator()]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-21
        • 1970-01-01
        • 2017-06-19
        • 1970-01-01
        • 2017-06-02
        相关资源
        最近更新 更多