#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)