【问题标题】:Trying to override Django User model username validation试图覆盖 Django 用户模型用户名验证
【发布时间】:2017-08-23 16:20:58
【问题描述】:

我正在尝试覆盖 django 默认用户模型用户名字段以允许用户名中的主题标签。

我知道模型本身会让我这样做,但标准表单注册似乎不允许这样做。我也在使用 django-allauth。

如何替换默认用户模型表单中的正则表达式以允许用户名中包含井号标签?

【问题讨论】:

    标签: django django-1.10


    【解决方案1】:

    django-allauth 有很多配置,其中一个选项是为用户名设置验证器

    ACCOUNT_USERNAME_VALIDATORS
    

    为了更好的参考,您可以查看https://django-allauth.readthedocs.io/en/latest/configuration.html

    ACCOUNT_USERNAME_VALIDATORS 接受自定义用户名验证器的路径列表。因此,您可以定义如下内容:

    ACCOUNT_USERNAME_VALIDATORS = ('myproject.myapp.validators.custom_username_validators')
    

    并且在指定路径'myproject.myapp.validators.CustomUsernameValidtor' 中,您必须定义一个验证器类,如:

    import re
    from django.utils.deconstruct import deconstructible
    from django.utils.translation import ugettext_lazy as _
    
    @deconstructible
    class CustomUsernameValidator(object):
        message = _('Invalid username')
    
        def __call__(self, value):
            if not re.match(r'[a-zA-Z0-9_@#-]+', value)
                raise DjangoValidationError(self.message, code='invalid_username')
    

    希望对你有帮助。

    问候。

    【讨论】:

    • 感谢您的回复。这让我更进一步,但我想我可能在 allauth 中遇到了一个错误。如果我将我的 account_username_validator 设置为就像你在那里的一样(当然是为我的代码格式化),我会收到一个错误,说 account_username_validator 应该是一个列表。如果我将其设为列表,则会收到断言错误,因为该检查不只查找字符串。
    • 哦!我看到了。好发现!它应该已修复,但我想它尚未部署。您还可以定义自己的自定义用户模型并使用 CharField 的属性验证器。
    【解决方案2】:

    我发现我实际上遇到了软件中的错误。

    https://github.com/pennersr/django-allauth/pull/1648

    对于其他发生的人。

    【讨论】:

      【解决方案3】:

      参考 Javier's Fix,您的验证器文件应如下所示:

      import re
      from django.utils.deconstruct import deconstructible
      from django.utils.translation import ugettext_lazy as _
      from django.core.exceptions import ValidationError
      
      @deconstructible
      class CustomUsernameValidator(object):
          message = _('Invalid username')
      
          def __call__(self, value):
              if not re.match(r'[a-zA-Z0-9_@#-]+', value):
                  raise ValidationError(self.message, code='invalid_username')
      
      
      custom_usename_validator = [CustomUsernameValidator()]
      

      还有你的 settings.py 文件:

      ACCOUNT_USERNAME_VALIDATORS = 'mypath.to.validators.custom_usename_validator'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-18
        • 1970-01-01
        相关资源
        最近更新 更多