Search code examples
pythondjango-authentication

Is there anyway to customise authenticate function of Django?


I am fairly new to Django so I wanted to know what should I do to make default authenticate function of Django accepts only email and password to login, assuming that in sign-up form I have both username and email. The following code does not work properly.However when I add

username = request.POST.get('username')

and change

user = authenticate(request, username=username email=email, password=password)

It logs in as expected.

The login View:

def LoginPage(request):
    if request.method == 'POST':
        email = request.POST.get('email')
        password = request.POST.get('password')

        user = authenticate(request, email=email, password=password)

        if user is not None:
            login(request, user)
            print('logged')
            return redirect('/inker/')
        
    return render(request, 'authy/login.html')

The sign up view:

def SignUpPage(request):
    form = CreateUserForm()

    if request.method == 'POST':
        form = CreateUserForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('/login/')

    context={'form':form}

    return render(request, 'authy/signup.html', context)

The form module:

from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm


class CreateUserForm(UserCreationForm):
    class Meta:
        model = User
        fields = ['username','email', 'password1', 'password2']

As you can see in Sign Up view we have both username and email but in login form I want it to just login user based on only email. How can I implement this.

Also how can I compact both username and email into one input when user wants to login? pretty much like instagram, facebook login page


Solution

  • If you just want to access user using email, you're not using authentication on the first place. So, to solve your purpose, following approaches can be followed:

    • Get user email in url params in every request (so that user can be identified)
    • Set default password while creating the user account for all users and use that password while authentication (not recommended)