简体   繁体   中英

Cannot login using email in django

I am trying to login using email instead of username in django, but it is not working. I am not getting any error also.

I also looked up solution for solutions in stackoverflow and other blogs/post also but not getting the output.

Can you please review my code where I am wrong/ modification needed. Any suggestions or changes are welcome.

Here is my code:

models.py

from django.db import models
from django.contrib.auth.models import (BaseUserManager,AbstractBaseUser)

# Create your models here.

class UserManager(BaseUserManager):
    def create_user(self, email,password=None):
        """
        Creates and saves a User with the given email, date of
        birth and password.
        """
        if not email:
            raise ValueError('Users must have an email address')

        user = self.model(
            email=self.normalize_email(email),
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, date_of_birth, password):
        """
        Creates and saves a superuser with the given email, date of
        birth and password.
        """
        user = self.create_user(
            email,
            password=password,
        )
        user.is_admin = True
        user.save(using=self._db)
        return user


class MyUser(AbstractBaseUser):
    email = models.EmailField(verbose_name='email address',
                                max_length=255,
                                unique=True,
                                )

    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    objects = UserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    def __str__(self):
        return self.email

    def has_perm(self, perm, obj=None):
        "Does the user have a specific permission?"
        # Simplest possible answer: Yes, always
        return True

    def has_module_perms(self, app_label):
        "Does the user have permissions to view the app `app_label`?"
        # Simplest possible answer: Yes, always
        return True

    @property
    def is_staff(self):
        "Is the user a member of staff?"
        # Simplest possible answer: All admins are staff
        return self.is_admin

views.py

from django.shortcuts import render
from django.contrib.auth.models import User
from django.contrib.auth import get_user_model,authenticate

from .forms import RegisterForm,LoginForm
# Create your views here.
def home(request):
    return render(request,'home.html',{})


def register_view(request):
    form      = RegisterForm(request.POST or None)
    context   = {"form":form}

    if form.is_valid():
        email    = form.cleaned_data['email']
        password = form.cleaned_data['password']

        new_user = User.objects.create_user(email,password)

    return render(request,'register.html',context)

def login_view(request):
    form = LoginForm(request.POST or None)
    context = {"form" : form}
    if form.is_valid():
        username = form.cleaned_data.get("username")
        password = form.cleaned_data.get("password")
        user = authenticate(request,username = username,password=password)
        if user is not None:
            login(request, user)
            print("Looged In")
            return redirect('home')

    else:
        print("Username or Password is Wrong")

    return render(request,'login.html',context)

backends.py

from django.contrib.auth import get_user_model
from django.contrib.auth.backends import ModelBackend

class EmailBackend(ModelBackend):
    def authenticate(self, 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

settings.py

AUTHENTICATION_BACKENDS = ['profile_manager.backends.EmailBackend']
AUTH_USER_MODEL = 'profile_manager.MyUser'

forms.py

from django import forms
from django.contrib.auth import get_user_model
from django.contrib.auth.models import User
from .models import MyUser


User = get_user_model()
class RegisterForm(forms.Form):


    email =forms.EmailField(widget = forms.TextInput(
                                attrs = {"class":"form-control",
                                          "placeholder":"Email"
                                            }),label='')

    password = forms.CharField(widget =forms.PasswordInput(attrs = {"class":"form-control",
                                                                    "placeholder":"Password"
                                                                            }),label='')

    password2 = forms.CharField(label ='' , widget = forms.PasswordInput(attrs = {"class":"form-control",
                                                                                                  "placeholder":"Confirm Password"
                                                                                                    }))



    def clean_email(self):
        email = self.cleaned_data.get('email')
        qs = User.objects.filter(email =email)
        if qs.exists():
            raise forms.ValidationError("Email is already taken")
        return email

    def clean(self):
        data =self.cleaned_data
        password = self.cleaned_data.get('password')
        password2 = self.cleaned_data.get('password2')
        if password2!= password:
            raise forms.ValidationError("Password must match")
        return data


class LoginForm(forms.Form):

    email = forms.EmailField(widget = forms.TextInput(
                                attrs = {"class":"form-control",
                                          "placeholder":"Username"
                                  }),label='')

    password = forms.CharField(widget =forms.PasswordInput(attrs = {"class":"form-control",
                                                                    "placeholder":"Password"
                                                                            }),label='')

This line in your login_view can't be right:

username = form.cleaned_data.get("username")

Your form doesn't have a username field, it only has an email field.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM