форма аутентификации django с пользовательской моделью пользователя (аннотация)

#django-forms #django-authentication #django-custom-user

Вопрос:

У меня есть приложение django, и я создал пользовательскую модель пользователя, чтобы я мог сделать email поле уникальным идентификатором пользователя (не username ).

Затем я работал над созданием страницы входа для пользователей, построенной поверх моей новой модели user_model.

Для этого я создал форму ( SignInForm ), которая использовалась в AuthenticationForm Django, из которой я, однако, удалил username поле (потому что в противном случае он продолжал говорить, что форма недействительна).

Тем не менее, я думаю, что делаю что-то не так, потому что, когда я это делаю form.is_valid() , я получаю «истину», даже если адрес электронной почты/пароль неверны.

Что я делаю не так?

Модель

 from django.contrib.auth.base_user import BaseUserManager from django.db import models from django.contrib.auth.models import AbstractUser from django.utils.translation import ugettext_lazy as _   class CustomUserManager(BaseUserManager):  """  Custom user model manager where email is the unique identifiers  for authentication instead of usernames.  """  def create_user(self, email, password, **extra_fields):  """  Create and save a User with the given email and password.  """  if not email:  raise ValueError(_('The Email must be set'))  email = self.normalize_email(email)  user = self.model(email=email, **extra_fields)  user.set_password(password)  user.save()  return user   def create_superuser(self, email, password, **extra_fields):  """  Create and save a SuperUser with the given email and password.  """  extra_fields.setdefault('is_staff', True)  extra_fields.setdefault('is_superuser', True)  extra_fields.setdefault('is_active', True)   if extra_fields.get('is_staff') is not True:  raise ValueError(_('Superuser must have is_staff=True.'))  if extra_fields.get('is_superuser') is not True:  raise ValueError(_('Superuser must have is_superuser=True.'))  return self.create_user(email, password, **extra_fields)   class CustomUser(AbstractUser):  username = None  email = models.EmailField(_('email address'), unique=True)   USERNAME_FIELD = 'email'  REQUIRED_FIELDS = []   objects = CustomUserManager()   def __str__(self):  return self.email  

форма

 from django.contrib.auth.forms import AuthenticationForm from myusermodel.models import CustomUser from django import forms   class SignInForm(AuthenticationForm):   def __init__(self, *args, **kwargs):  super().__init__(*args, **kwargs)   self.fields.pop('username')   self.fields['email'].widget.attrs.update({  'class': 'form-input',  'required':'',  'name':'email',  'id':'email',  'type':'email',  'placeholder':'JohnDoe@mail.com',  })  self.fields['password'].widget.attrs.update({  'class': 'form-input',  'required':'',  'name':'password',  'id':'password',  'type':'password',  'placeholder':'password',  'maxlength':'22',  'minlength':'8'  })    email = forms.EmailField(max_length=100)   class Meta:  model = CustomUser  fields = ['email', 'password']   

view

 from django.shortcuts import render,redirect from myusermodel.forms.SignInForm import SignInForm from django.contrib.auth import authenticate, login    def sign_in(request):   if request.user.is_anonymous:  if request.method == 'POST':  form = SignInForm(data=request.POST)  print('errors')  print(form.errors)  print(form.data)    if form.is_valid():  print('form valid')  email = form.cleaned_data.get('email')  password = form.cleaned_data.get('password')  new_user = authenticate(email=email,password=password)  print(new_user)  if new_user is not None:  login(request,new_user)  return redirect('action:home')  else:  form = SignInForm()  else:  return redirect('action:home')   context = {  'form': form  }   return render(request, 'myusermodel/sign_in.html', context)