我为User
创建了一个带有附加字段的新模型。
models.py:
class UserProfile(models.Model):
user = models.OneToOneField(User)
email = models.CharField(max_length=50)
birthday = models.DateField(u'Birthday', blank=True, null=True)
avatar = models.ImageField(Avatar', upload_to='profile/avatar', blank=True)
def __unicode__(self):
return self.user
然后我为用户创建注册表格:
class RegistrationForm(ModelForm):
username = forms.CharField(label=(u'Enter Your Username'))
email = forms.EmailField(label=(u'Enter Your E-mail'))
password = forms.CharField(label=(u'Enter Password'), widget=forms.PasswordInput(render_value=False))
password1 = forms.CharField(label=(u'Verify Your Password'), widget=forms.PasswordInput(render_value=False))
class Meta:
model = UserProfile
exclude = ('user',)
def clean_email(self):
email = self.cleaned_data['email']
try:
User.objects.get(email=email)
except User.DoesNotExist:
return email
raise forms.ValidationError("User with same e-mail is already exist, please type another email")
def clean_password(self):
password = self.cleaned_data['password']
password1 = self.cleaned_data['password1']
if not password1:
raise forms.ValidationError("You have ti verify your password")
if password != password1:
raise forms.ValidationError("Your passwords doesn't match")
return password1
这是我对注册页面的看法:
def UserProfileRegistration(request):
if request.user.is_authenticated():
return HttpResponseRedirect('/info/')
if request.method == 'POST':
form = RegistrationForm(request.POST)
if form.is_valid():
user = User.objects.create_user(username=form.cleaned_data['username'], email=form.cleaned_data['email'], password=form.cleaned_data['password'])
user.save()
user_profile = UserProfile(user=user)
user_profile.save()
return HttpResponseRedirect('/info/')
else:
return render(request, 'profiles/registration.html', {'form':form})
else:
form = RegistrationForm()
context = {'form':form}
return render (request, 'profiles/registration.html', context)
我是否填写正确或错误的密码并不重要,但我有相同的错误KeyError at /registration/
,Exception Value: 'password1'
。谢谢你的回答。
发布于 2016-01-23 11:10:13
在调用password1
时,不能保证已经将clean_password()
添加到clean_password()
中。对于任何需要存在多个字段的验证,您应该在一般的clean()
方法中这样做。
发布于 2016-01-23 11:08:16
对于模型表单,如果指定了像password1这样的非模型字段,就必须在forms类中提到field属性。
模型表单将只包括现有的模型字段。将此添加到模型表单元类中:
class Meta:
model = UserProfile
fields = ('username', 'email', 'password', 'password1')
发布于 2016-01-23 12:49:18
Django用户已经没有需要添加的电子邮件了(参见https://docs.djangoproject.com/en/1.9/topics/auth/default/#user-objects)
class UserProfile(models.Model):
user = models.OneToOneField(User)
birthday = models.DateField(u'Birthday', blank=True, null=True)
avatar = models.ImageField(Avatar', upload_to='profile/avatar', blank=True)
def __unicode__(self):
return self.user
此外,您还需要在表单中为password1添加clean()作为密码。
https://stackoverflow.com/questions/34962398
复制相似问题