是否有可能从FormField中消除所有验证器而不会覆盖该字段?

时间:2013-04-20 13:33:15

标签: django django-forms

我在Django 1.5.1中有以下环境:

forms.py

class UserForm(forms.ModelForm):
    class Meta:
        model = User
        widgets = {
            'username': forms.TextInput(attrs={'class': 'input-xlarge', 'placeholder': 'Email Address'}),
            'first_name': forms.TextInput(attrs={'class': 'input-xlarge', 'placeholder': 'First Name'}),
            'last_name': forms.TextInput(attrs={'class': 'input-xlarge', 'placeholder': 'Last Name'}),
            'mobile_phone': forms.TextInput(attrs={'class': 'input-xlarge', 'placeholder': 'Mobile Phone'}),
            'office_phone': forms.TextInput(attrs={'class': 'input-xlarge', 'placeholder': 'Office Phone'}),
        }

    GROUP_CHOICES = [(-1, '[Select]')]
    GROUP_CHOICES += [(group.id, group.name.capitalize()) for group in Group.objects.all()]

    username = forms.EmailField(
        label='Email Address',
        required=True,
        validators=[validate_email],
        widget=forms.TextInput(attrs={'class': 'input-xlarge', 'placeholder': 'Email Address'})
    )
    password1 = forms.CharField(
        label='Password',
        widget=forms.PasswordInput(attrs={'class': 'input-xlarge', 'placeholder': 'Password'})
    )
    password2 = forms.CharField(
        label='Password confirmation',
        widget=forms.PasswordInput(attrs={'class': 'input-xlarge', 'placeholder': 'Password confirmation'})
    )
    group = forms.ChoiceField(
        label='Group',
        choices=GROUP_CHOICES
    )

    def clean_password2(self):
        password1 = self.cleaned_data.get('password1')
        password2 = self.cleaned_data.get('password2')
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError('Passwords don\'t match')
        return password2

    def clean_group(self):
        if self.cleaned_data['group'] == '-1':
            raise forms.ValidationError('This field is required.')
        return self.cleaned_data['group']

    def clean_first_name(self):
        if self.cleaned_data['first_name'] == '':
            raise forms.ValidationError('This field is required.')
        return self.cleaned_data['first_name']

    def clean_last_name(self):
        if self.cleaned_data['last_name'] == '':
            raise forms.ValidationError('This field is required.')
        return self.cleaned_data['last_name']

    def save(self, commit=True):
        user = super(UserForm, self).save(commit=False)
        user.set_password(self.cleaned_data['password1'])
        user.username = self.cleaned_data['username']
        if commit:
            user.save()
            user.groups.clear()
            user.groups.add(self.cleaned_data['group'])
            user.save()
        return user

models.py

class User(auth.models.User):
    mobile_phone = models.CharField(
        verbose_name='Mobile Phone',
        max_length=50
    )
    office_phone = models.CharField(
        verbose_name='Office Phone',
        max_length=50
    )

ALTER * auth_user *允许我插入超过30个字符的用户名,这样我就可以使用电子邮件作为用户名 (我已经尝试使用 OneToOneField 并使用自定义模型,这些方法让我的工作量超出预期,所以我不会采取这种方式)

我的问题:

  1. 我必须添加first_name和last_name清理程序,因为auth.models.User没有将它们作为 required ,并且widget对象不允许我设置 required 属性,这是最好的方法吗?
  2. 我只有一个问题,用户名字段最多仍然有 MaxValueValidator 设置为30。我怎么能在没有覆盖它的情况下消失它。由于我正在使用基于类的视图,当我尝试通过 UpdateView 类更新表单时,覆盖字段不会启动带有模型数据的用户名字段,将其留空。其余字段没有任何问题
  3. 谢谢,对不起,如果我的英文看起来很难看!

1 个答案:

答案 0 :(得分:0)

好的,我发现如何避免这种行为,因为MaxValueValidator在模型一侧运行我在forms.py中覆盖clean_username并添加self._meta.exclude += ('username',)以避免在模型中进行验证。当然,如果您的Meta类中没有任何exclude属性,那么只需使用self._meta.exclude = ('username',)