gpt4 book ai didi

Django 覆盖 ASCIIUsernameValidator

转载 作者:行者123 更新时间:2023-12-04 23:39:57 32 4
gpt4 key购买 nike

使用 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 处的讨论并且感觉从一开始就创建自定义用户可能是默认情况下的方法。

最佳答案

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

验证器.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。

模型.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。

关于Django 覆盖 ASCIIUsernameValidator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40982521/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com