Django:ModelForm验证不起作用

时间:2014-02-11 15:05:16

标签: django modelform

我正在尝试创建用户注册表单。我知道在Django中有一个内置的用户注册表单,但我正在挑战自己创建一个。

我从User模型创建了一个ModelForm,并编写了一些验证和确认密码的方法。但clean_password() clean()form.is_valid()并未执行views.pyclass RegistrationForm(ModelForm): re_password = CharField(widget = PasswordInput(attrs = {'placeholder' : 'Re-password'})) class Meta: model = User fields = ['username', 'email', 'password'] widgets = { 'username' : TextInput(attrs = {'placeholder':'Username'}), 'email' : EmailInput(attrs = {'placeholder' : 'Email'}), 'password' : PasswordInput(attrs = {'placeholder' : 'Password'}) } def clean_password(self): password = self.cleaned_data['password'] if len(password) < 6: raise forms.ValidationError('Password not long enough. Should be >= 6') return password def clean(self): if not self.cleaned_data['password'] == self.cleaned_data['re_password']: raise forms.ValidationError("Passwords should match") return self.cleaned_data 方法。

以下是RegistrationForm的片段 -

password

其他问题

form.save()似乎没有.set_password()加密{{1}}。我不得不创建新的User实例并调用其{{1}}方法来加密它。这是正确的方法吗?

3 个答案:

答案 0 :(得分:3)

你必须设置密码是正确的。您的视图应如下所示:

if form.is_valid():
    user = form.save(commit=False)  # Don't waste the database write
    user.set_password(form.cleaned_data['password'])
    user.save()

更新

  1. 您需要移除clean_password方法并将validators=[validators.MinLengthValidator(6)]添加到password模型字段的声明中(或者只需将password定义为表单上的字段,并提供min_length=6

  2. 您需要将clean方法降级1级,否则永远不会被调用(它当前被定义为Meta类的方法。)

答案 1 :(得分:1)

缩进错误。验证器位于META内,而不是RegistrationForm

答案 2 :(得分:0)

首先,您可以在__init__表单方法中定义密码字段的min_length,如下所示:

def __init__(self, *args, **kwargs):
    super(RegistrationForm, self).__init__(*args, **kwargs)
    self.fields['password'].min_length = 6

第二,是的,这是正确的方式