2015-04-28 83 views
1

我正在使用AbstractUser模型创建自定义验证模型。覆盖AbstractUser模型的默认django用户名验证器

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

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 

任何帮助表示赞赏!

回答

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] 

注:请确保您同时覆盖模式和形式L evel验证器!

+0

utils是我创建的库,其中包含我的项目的自定义过滤器和验证程序。 – HassenPy

0

您可以在表单上明确定义一个字段。这样一来,你可以完全掌控的领域,包括它的验证:

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

    class Meta: 
     model = User 
+0

对不起,延迟,我也试过这样做,我遇到的问题是,即使自定义验证程序通过,默认的一个不断弹出! – HassenPy

+1

然后我怀疑它是由另一个问题引起的。您在什么情况下使用该表格,并且可以显示一些代码? – knbk