如何在django中检查确认电子邮件相同

时间:2014-12-04 17:31:44

标签: python django django-forms django-validation

我有以下表格:

class SignupForm(forms.ModelForm):
    time_zone = forms.ChoiceField(choices=TIMEZONE_CHOICES) 
    email = forms.EmailField()
    confirm_email = forms.EmailField()
    password1 = forms.CharField(widget=forms.PasswordInput())
    password2 = forms.CharField(widget=forms.PasswordInput())     

    class Meta:
        model = Customer
        fields = (
                  'first_name', 
                  'last_name',
                  'coupon_code'
                  )

    def clean_email(self):
        email = self.cleaned_data['email']
        print 'email cleaned data: '+cleaned_data
        try:
            User.objects.get(email=email)
            raise forms.ValidationError('Email already exists.')
        except User.DoesNotExist:
            return email

    def clean_confirm_email(self):
        print '-----'
        print 'confirm email cleaned data: '+cleaned_data
        email = self.cleaned_data['email']
        confirm_email = self.cleaned_data['confirm_email']
        if email != confirm_email:
            raise forms.ValidationError('Emails do not match.')
        return confirm_email

打印:

email cleaned data: 
{'coupon_code': u'coup', 'first_name': u'Gina', 'last_name': u'Silv', 'time_zone': u'America/New_York', 'email': u'4email@example.net'}
-----
confirm email cleaned data: 
{'first_name': u'Gina', 'last_name': u'Silv', 'confirm_email': u'4email@example.net', 'time_zone': u'America/New_York', 'coupon_code': u'coup'}

当这个运行时我得到错误:

key error 'email' self.cleaned_data['email']

如何访问clean_confirm_email方法中的电子邮件字段?

1 个答案:

答案 0 :(得分:2)

您不应该在clean_confirm_email()方法中执行该验证。相反,按照推荐的clean()方法进行,如下所示:

def clean(self):
        cleaned_data = super(SignupForm, self).clean()
        email = cleaned_data.get("email")
        confirm_email = cleaned_data.get("confirm_email")

        if email and confirm_email:
        # Only do something if both fields are valid so far.
            if email != confirm_email:
                raise forms.ValidationError("Emails do not match.")

        return cleaned_data

此处有更多信息:https://docs.djangoproject.com/en/1.6/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other