我正在使用内置于用户创建表单的django,我将其扩展为
class RegistrationForm(UserCreationForm):
email = forms.EmailField(required=True, widget=forms.TextInput(attrs={'placeholder': 'E-mail address'}))
first_name = forms.CharField(required=True)
last_name = forms.CharField(required=True)
class Meta:
model = User
fields = ('first_name', 'last_name', 'email', 'username', 'password1', 'password2')
def clean_email(self):
email = self.cleaned_data["email"]
try:
User._default_manager.get(email=email)
except User.DoesNotExist:
return email
#raise forms.ValidationError(self.error_messages['duplicate_email'])
raise forms.ValidationError('duplicate_email')
def save(self, commit=True):
user = super(RegistrationForm, self).save(commit=False)
user.email = self.cleaned_data['email']
if commit:
user.save()
return user
如您所见,我已添加电子邮件验证,以检查是否已有用户使用该电子邮件(我不接受)。 问题是我的模板中没有显示那些错误,我不知道为什么。我试过{{form.field.errors}},甚至用{{form.errors.values。[i]}}但是没有任何帮助 我查看了auth.forms以检查类UserCreationForm,我发现它将错误传递给error_messages但我找不到显示它们的方法。
虽然所有验证(用户名检查,密码检查,电子邮件检查)都能正常工作,但我仍然希望在错误上方显示错误,以便用户了解他无法创建帐户的原因。
更新
views.py
def register_user(request):
if request.method == 'POST':
form = RegistrationForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect('/accounts/register_success')
args = {}
args.update(csrf(request))
args['form'] = RegistrationForm()
return render_to_response('user_profile/register.html', args, context_instance=RequestContext(request))
我希望有人可以帮助我。 感谢
答案 0 :(得分:3)
这将有效:
def register_user(request):
args = {}
args.update(csrf(request))
if request.method == 'POST':
form = RegistrationForm(request.POST)
args['form'] = form
if form.is_valid():
form.save()
return HttpResponseRedirect('/accounts/register_success')
else:
args['form'] = RegistrationForm()
return render_to_response('user_profile/register.html', args, context_instance=RequestContext(request))
您的代码的问题在于您始终将未绑定的表单实例传递给模板,因此您只是覆盖任何发生的错误。
在这里查看参考:docs
答案 1 :(得分:0)
如果您正在寻找更有效的解决方案,那么您应该在views.py文件中尝试以下代码。
您的forms.py代码将是相同的。但它是密码验证的漏洞。
# to register auth user
class register_user(View):
template1 = "app_name/register.html" # define templates
template2 = "app_name/login.html"
def get(self, request): # get method
form = RegistrationForm()
return render(request, self.template1, locals())
def post(self, request): # post method
form = RegistrationForm(request.POST) # create form object
if form.is_valid():
print "Form is validated"
user_data = form.save(commit=False)
user_data.save()
return render(request, self.template2, locals())
else:
print "with error"
return render(request, self.template1, locals())
我希望这会有所帮助。我还在努力练习Django。