显示django用户创建表单错误

时间:2013-11-29 15:55:20

标签: python django

我正在使用内置于用户创建表单的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))

我希望有人可以帮助我。 感谢

2 个答案:

答案 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。