【问题标题】:Override default django username validators for AbstractUser model覆盖 AbstractUser 模型的默认 django 用户名验证器
【发布时间】:2015-04-28 14:07:37
【问题描述】:

我正在使用 AbstractUser 模型来创建自定义身份验证模型。

问题是我无法覆盖用户名字段的默认表单字段验证器,这是我迄今为止尝试过的:

class RegularUserForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
    super(RegularUserForm, self).__init__(*args, **kwargs)
    self.fields['username'].help_text = None
    self.fields['username'].default_validators = []
    self.fields['username'].validators = []

不知道如何做到这一点,覆盖 help_text 是成功的,我也尝试使用 [None] 而不是 []self.fields['username'].validators = [validate_username] 其中 validate_username 是我创建的自定义验证器。


以下是表单代码示例:

class RegularUserForm(forms.ModelForm):
    username = forms.CharField(max_length=30, validators=[validate_username])
    email1 = forms.EmailField(required=True, label='')

class Meta:
    model = RegularUser
    fields = ['username', 'password', 'email', 'email1', 'gender', ]
    widgets = {'password': forms.PasswordInput(attrs={'placeholder': 'enter password'}),
               'email': forms.EmailInput(attrs={'placeholder': 'enter email'})
               }

def clean(self):
    cleaned_data = super(RegularUserForm, self).clean()
    email = self.cleaned_data.get('email')
    email1 = self.cleaned_data.get('email1')

    if email != email1:
        self.add_error("email1", 'emails do not match')
    return cleaned_data

感谢任何帮助!

【问题讨论】:

    标签: django validation


    【解决方案1】:

    谢天谢地,我找到了解决方案,我覆盖了表单中的验证器,但没有覆盖模型中的验证器(也做了相反的事情),所以我不得不这样做:

    from utils import validate_username
    class RegularUserForm(forms.ModelForm):
        username = forms.CharField(max_length=50, validators=[validate_username])
    

    class RegularUser(AbstractUser):
        def __init__(self, *args, **kwargs):
            super(RegularUser, self).__init__(*args, **kwargs)
            self._meta.get_field('username').validators = [validate_username]
    

    读者注意事项:确保覆盖模型和表单级别的验证器!

    【讨论】:

    • utils 是我创建的一个库,其中包含用于我的项目的自定义过滤器和验证器。
    【解决方案2】:

    您可以在表单上明确定义一个字段。这样,您就可以完全控制该字段,包括其验证器:

    class RegularUserForm(forms.ModelForm):
        username = forms.CharField(max_length=30)
    
        class Meta:
            model = User
    

    【讨论】:

    • 抱歉耽搁了,我也试过这样做,我遇到的问题是即使自定义验证器通过,默认的验证器仍然弹出!
    • 那么我怀疑这是由另一个问题引起的。你在什么情况下使用表单,你能显示一些代码吗?
    猜你喜欢
    • 1970-01-01
    • 2017-08-23
    • 2019-05-22
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 2020-01-17
    • 2022-01-11
    相关资源
    最近更新 更多