Django CustomUser Model - адрес электронной почты уже занят
Я пытался сделать CustomUser Manager в Django. Когда я пытаюсь войти или зарегистрировать нового пользователя с помощью моей формы, я всегда получаю ошибки, такие как: "Адрес электронной почты уже занят" или "Пароли не совпадают". Я пробовал разные решения здесь, но пока ничего не помогло. Я новичок в кодинге, поэтому, пожалуйста, не судите меня :)
models.py
from django.db import models
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from django.contrib.auth.models import (
BaseUserManager, AbstractBaseUser, PermissionsMixin
)
class MyUserManager(BaseUserManager):
def create_user(self, email, password=None):
if not email:
raise ValueError('Users must have an email address')
email = self.normalize_email(email)
user = self.model(email=email)
user.set_password(password)
user.save()
return user
def create_superuser(self, email, password=None):
"""
Creates and saves a superuser with the given email, date of
birth and password.
"""
user = self.create_user(
email,
password=password,
)
user.is_staff = True
user.save()
return user
class NewUser(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(_('Email Adresse'), unique=True)
user_name = models.CharField(max_length=20, unique=True)
first_name = models.CharField(max_length=30, blank=False)
last_name = models.CharField(max_length=50, blank=False)
birthdate = models.DateField(null=True, blank=False)
start_date = models.DateTimeField(default=timezone.now)
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=False)
sex = models.CharField(max_length=1, default='K', choices=Sex.SEX_CHOICES,)
vacc = models.CharField(max_length=1, default='K', choices=Vacc.VACC_CHOICES,)
objects = MyUserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
def __str__(self):
return self.email
Я всегда получаю ошибку: "Адрес электронной почты уже занят". Есть идеи, как это исправить?
views.py
from django.core.checks import messages
from django.shortcuts import render
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.decorators import login_required
from django.shortcuts import HttpResponse, HttpResponseRedirect, render
from django.db import IntegrityError
from django.urls import reverse
from users.models import NewUser
# Create your views here.
def index(request):
# Authenticated users view their inbox
if request.user.is_authenticated:
return render(request, "events/index.html")
# Everyone else is prompted to sign in
else:
return HttpResponseRedirect(reverse("login"))
def login_view(request):
if request.method == "POST":
# Attempt to sign user in
email = request.POST["email"]
password = request.POST["password"]
user = authenticate(request, username=email, password=password)
# Check if authentication successful
if user is not None:
login(request, user)
return HttpResponseRedirect(reverse("index"))
else:
return render(request, "users/login.html", {
"message": "Falsche E-Mail Adresse oder Passwort."
})
else:
return render(request, "users/login.html")
def register(request):
if request.method == "POST":
email = request.POST["email"]
# Ensure password matches confirmation
password = request.POST["password"]
confirmation = request.POST["confirmation"]
if password != confirmation:
return render(request, "users/register.html", {
"message": "Dein Passwort muss übereinstimmen."
})
# Attempt to create new user
try:
user = NewUser.objects.create_user(email)
user.save()
except IntegrityError as e:
print(e)
return render(request, "users/register.html", {
"message": "Email address already taken."
})
login(request, user)
return HttpResponseRedirect(reverse("activate"))
else:
return render(request, "users/register.html")
Вам необходимо написать новую форму NewUserForm. В настоящее время вы используете стандартную форму модели, которая имеет валидацию создания пользователя.
class NewUserForm(UserCreationForm):
email = forms.EmailField(required=True)
class Meta:
model = User
fields = ("username", "email", "password1", "password2")
def save(self, commit=True):
user = super(NewUserForm, self).save(commit=False)
user.email = self.cleaned_data['email']
if commit:
user.save()
return user
def register_request(request):
if request.method == "POST":
form = NewUserForm(request.POST)
if form.is_valid():
user = form.save()
login(request, user)
messages.success(request, "Registration successful." )
return redirect("main:homepage")
messages.error(request, "Unsuccessful registration. Invalid information.")
form = NewUserForm()
return render (request=request, template_name="main/register.html", context={"register_form":form})
Но может быть проблема с вашим шаблоном входа, который отправляет данные в конечную точку регистрации.