【问题标题】:Django override ASCIIUsernameValidatorDjango 覆盖 ASCIIUsernameValidator
【发布时间】:2016-12-05 20:13:03
【问题描述】:

使用 Django 1.10 我想允许在用户名中使用 \ 字符,因为我正在使用 'django.contrib.auth.middleware.RemoteUserMiddleware' 的 Windows 环境中工作,并且远程用户以域\用户名的形式出现(我不想删除该域,因为它用于某些业务逻辑)。

我可以很容易地更改 django\contrib\auth\validators.py 并通过将 regex = r'^[\w.@+-]+$' 行修改为 regex = r'^[\w.@+-\\]+$' 来获得所需的效果,但是,我认为可以轻松地覆盖这个类,但我失败了。

我找到了一些有用的链接(以及许多其他类似的链接):

https://stackoverflow.com/a/39820162/4872140

https://stackoverflow.com/a/1214660/4872140

https://docs.djangoproject.com/en/1.10/releases/1.10/#official-support-for-unicode-usernames https://docs.djangoproject.com/en/1.10/ref/contrib/auth/#django.contrib.auth.models.User.username_validator

但信息已过时,或者没有完全/完全显示如何解决我的问题(在最后两个的情况下)。我很喜欢这个应用程序,所以更改 AUTH_USER_MODEL 没有吸引力。 设置.py:

AUTH_USER_MODEL = 'myapp.MyUser'

我还是尝试了,认为我可以在 User 模型上使用代理,如下所示,这会导致错误“无法代理交换的模型 'myapp.DomainUser'”:

class DomainASCIIUsernameValidator(ASCIIUsernameValidator):
    regex = r'^[\w.@+-\\]+$'

class DomainUser(User):
    username_validator = DomainASCIIUsernameValidator()

    class Meta:
        proxy = True

有没有办法以用户模型保持原样的方式替换 ASCIIUsernameValidator(和 UnicodeUsernameValidator)中的正则表达式。如果您按照https://docs.djangoproject.com/en/1.10/ref/contrib/auth/#django.contrib.auth.models.User.username_validator 中的描述对用户模型进行子类化,您是否坚持在 AUTH_USER_MODEL 中指定它?

我已经阅读了https://groups.google.com/forum/#!topic/django-developers/MBSWXcQBP3k/discussion 的讨论,觉得从一开始就创建一个自定义用户可能是默认情况下的一种方式。

【问题讨论】:

    标签: django


    【解决方案1】:

    我花了一整天的时间和许多不同的答案来完成这项工作。我将代码分成不同的部分。首先,我们有我们的验证器:

    validators.py

    from django.contrib.auth.validators import UnicodeUsernameValidator
    from django.utils.translation import ugettext_lazy as _
    
    
    class DomainUnicodeUsernameValidator(UnicodeUsernameValidator):
        """Allows \."""
        regex = r'^[\w.@+-\\]+$'
        message = _(
            'Enter a valid username. This value may contain only letters, '
            'numbers, and \/@/./+/-/_ characters.'
        )
    

    我为消息添加了更改,还说 \ 是允许的。您还可以轻松添加 DomainASCIIUsernameValidator。

    models.py

    from django.contrib.auth.models import User
    
    from .validators import DomainUnicodeUsernameValidator
    
    
    class DomainUser(User):
        class Meta:
            proxy = True
    
        def __init__(self, *args, **kwargs):
            self._meta.get_field(
                'username'
            ).validators[0] = DomainUnicodeUsernameValidator()
    
            super().__init__(*args, **kwargs)
    

    这会抓取我们之前设置的验证器。它还代理默认用户并为用户名字段设置验证器。您可以将验证器设置为列表以包含新验证器和最大长度验证器(如果订单更改,这可能更安全)。

    forms.py

    from django.contrib.auth.forms import UserChangeForm
    from django.utils.translation import ugettext_lazy as _
    
    from .models import DomainUser
    
    
    class DomainUserChangeForm(UserChangeForm):
        class Meta(UserChangeForm.Meta):
            model = DomainUser
            help_texts = {
                'username': _('Required. 150 characters or fewer. Letters, digits and \/@/./+/-/_ only.'),  # NOQA
            }
    

    在这里,我扩展了 UserChangeForm 并将模型设置为代理模型,并更改了用户名验证。

    如果您希望允许用户使用 \ 添加用户名,那么您还需要以类似的方式更改 UserAddForm。

    最后,在 admin.py

    from django.contrib import admin
    from django.contrib.auth.admin import UserAdmin
    from django.contrib.auth.models import User
    
    from .forms import DomainUserChangeForm
    
    
    class DomainUserAdmin(UserAdmin):
        form = DomainUserChangeForm
    
    
    admin.site.unregister(User)
    admin.site.register(User, DomainUserAdmin)
    

    我们为我们的管理员设置了表单,该表单将在 django 管理页面中使用。然后取消设置用户管理员并将其替换为我们的自定义 DomainUserAdmin。

    【讨论】:

    • 哇!我刚刚开始了一个新项目,我会在接下来的一天左右对这个项目进行一次尝试。
    • 如果你要开始一个新项目,我建议你创建一个新的用户模型。他们甚至推荐它link如果你正在开始一个新项目,强烈建议设置自定义用户模型,即使默认用户模型对你来说已经足够了。此模型的行为与默认用户模型相同,但您可以在未来需要时对其进行自定义:.
    • 在我将 admin.site.register(User, DomainUserAdmin) 设置为 admin.site.register(DomainUser, DomainUserAdmin) 后,这对我有用,在 Django 3.1.7 中签入并感谢您,切换到 IIS 域身份验证后陷入类似的情况
    猜你喜欢
    • 2014-03-01
    • 2011-01-10
    • 1970-01-01
    • 2014-05-12
    • 2016-03-20
    • 2011-08-17
    • 2017-02-26
    • 2014-06-09
    • 2017-05-26
    相关资源
    最近更新 更多