我正在尝试创建用户注册表单。我知道在Django中有一个内置的用户注册表单,但我正在挑战自己创建一个。
我从User模型创建了一个ModelForm,并编写了一些验证和确认密码的方法。但clean_password()
clean()
处form.is_valid()
并未执行views.py
和class 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}}方法来加密它。这是正确的方法吗?
答案 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()
您需要移除clean_password
方法并将validators=[validators.MinLengthValidator(6)]
添加到password
模型字段的声明中(或者只需将password
定义为表单上的字段,并提供min_length=6
。
您需要将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
第二,是的,这是正确的方式