Django clean_email函数返回"输入有效的电子邮件"

时间:2018-02-08 08:17:20

标签: python django email

我在forms.py中创建了一个clean_email函数来检查该人注册的电子邮件是否是注册学校的一部分。

这是表格:

class StudentRegister(UserCreationForm):
    email = forms.EmailField(required = True)

    def __init__(self, *args, **kwargs):
        super(StudentRegister, self).__init__(*args, **kwargs)
        self.fields['email'].widget.attrs['placeholder'] = 'example@example.com'
        self.fields['first_name'].widget.attrs['placeholder'] = 'First Name'
        self.fields['last_name'].widget.attrs['placeholder'] = 'Last Name'
        self.fields['password1'].widget.attrs['placeholder'] = 'Password'
        self.fields['password2'].widget.attrs['placeholder'] = 'Password'

    class Meta:
        model = get_user_model()

        fields = (
            'email',
            'first_name',
            'last_name',
            'password1',
            'password2'            
        )    

    def clean_email(self):
        email = self.cleaned_data.get('email')
        email = email.split('@')[1] 
        try:
            school = School.objects.get(email_domain = email)
        except ObjectDoesNotExist:
            raise forms.ValidationError('School not found, check your email') 

        return email

    def save(self):
        user = super(StudentRegister, self).save()

        student = Student(user = user)


        student.save()

        return user, student

这是学生注册的视图:

def student_registration(request):
    #Student Registration

    if request.method == 'POST':
        form = StudentRegister(request.POST)
        #Gets school object from email domain.        
        email = form['email'].value().split('@')[1]
        try:
            school = School.objects.get(email_domain = email)
        except ObjectDoesNotExist:
            pass

        if form.is_valid() and school:
            user, Student = form.save()
            Student.school = school
            Student.save()
            user.groups.add(Group.objects.get(name='Student'))
            #user.is_active to stop users logging in without confirming their emails
            user.is_active = False
            user.save()

            #Sends confirmation link.
            send_confirmation_email(request, user)

            args = {'email': user.email,
                    'link': user.Student.school.email_website,}
            return render(request, 'email/token_sent.html', args)

        else:
            args = {'form': form,}
            return render(request, 'users/students.html', args)

    else:
        form = StudentRegister()
        args = {'form': form,}
        return render(request, 'users/students.html', args)

表单上显示的错误是"输入有效的电子邮件地址。"即使我输入有效的电子邮件。

任何想法可能是什么问题?

1 个答案:

答案 0 :(得分:2)

clean_email方法中,您可以使用域覆盖原始电子邮件。将您的代码更改为:

def clean_email(self):
    original_email = self.cleaned_data.get('email')
    email = original_email.split('@')[1] 
    try:
        school = School.objects.get(email_domain = email)
    except ObjectDoesNotExist:
        raise forms.ValidationError('School not found, check your email') 

    return original_email