Skip to main content
 首页 » 编程设计

python之Django clean_email 函数返回 "enter a valid email"

2024年08月16日32zhengyun_ustc

我在我的 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 

这是学生注册的 View :

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) 

出现在表单上的错误是“输入有效的电子邮件地址”。即使我输入了有效的电子邮件。

知道问题出在哪里吗?

请您参考如下方法:

在 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