Removing case sensitivity from Email in Django login form

前端 未结 3 1229
旧时难觅i
旧时难觅i 2021-01-12 14:28

Before anyone marks it as duplicate, I\'ve searched everywhere and didn\'t find. I\'ve created a custom UserModel and used Email as main authenticating id instead of usernam

3条回答
  •  攒了一身酷
    2021-01-12 14:42

    You don't need to change much to accomplish this - in your case you just need to change the form and make use of Django's built-in form data cleaners or by making a custom field.

    You should use the EmailField instead of a CharField for built-in validation. Also you did not post your AuthenticationForm, but i presume you have changed it to include email instead of username.

    With data cleaners:

    class SignUpForm(UserCreationForm):
        # your code
        email = forms.EmailField(required=True)
        def clean_email(self):
            data = self.cleaned_data['email']
            return data.lower()
    
    class AuthenticationForm(forms.Form):
        # your code
        email = forms.EmailField(required=True)
        def clean_email(self):
            data = self.cleaned_data['email']
            return data.lower()
    

    With a custom field:

    class EmailLowerField(forms.EmailField):
        def to_python(self, value):
            return value.lower()
    
    class SignUpForm(UserCreationForm):
        # your code
        email = EmailLowerField(required=True)
    
    class AuthenticationForm(forms.Form):
        # your code
        email = EmailLowerField(required=True)
    

    This way you can make sure that each email is saved to your database in lowercase and that for each login attempt the email is lowercased before compared to a database value.

提交回复
热议问题