A_K
A_K

Reputation: 912

How to case insensitive username and email for a Django Project

I have the following authentication for users in Django:

class EmailBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        UserModel = get_user_model()
        try:
            user = UserModel.objects.get(email=username)
        except UserModel.DoesNotExist:
            return None
        else:
            if user.check_password(password):
                return user
        return None

def register(request):
    if request.method == 'POST':
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            messages.success(request, f'Your account has been created! You are now able to log in')
            return redirect('login')
    else:
        form = UserRegisterForm()
    return render(request, 'users/register.html', {'form': form})

Users can log in using their Username or email but if the email or user name has a case sensitive letter it shows as an error:

Please enter the correct username and password. Note that both fields may be case-sensitive.

models.py

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

forms.py

class UserRegisterForm(UserCreationForm):
    email = forms.EmailField()

    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']

My question: How can authenticate users with case insensitive username or email:

Upvotes: 1

Views: 868

Answers (2)

brandonris1
brandonris1

Reputation: 455

If you want to make the username/email case insensitive, I think a simple way to do it would be to update your view as follows:

def register(request):
    if request.method == 'POST':
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username').lower()
            form.save()
            messages.success(request, f'Your account has been created! You are now able to log in')
            return redirect('login')
    else:
        form = UserRegisterForm()
    return render(request, 'users/register.html', {'form': form})

Upvotes: 1

Nahidur Rahman
Nahidur Rahman

Reputation: 815

You need to make it lower/upper case when registering the user.

def register(request):
    if request.method == 'POST':
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username')
            form.cleaned_data['username'] = username.lower()
            # do same for email if needed
            form.save()
            messages.success(request, f'Your account has been created! You are now able to log in')
            return redirect('login')
    else:
        form = UserRegisterForm()
    return render(request, 'users/register.html', {'form': form})

And also when authenticating the user check with the same case.

class EmailBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        UserModel = get_user_model()
        try:
            user = UserModel.objects.get(email=username.lower())
        except UserModel.DoesNotExist:
            return None
        else:
            if user.check_password(password):
                return user
        return None

Upvotes: 2

Related Questions