Пользовательская модель пользователя Django - Ошибка "Необходимо указать имя пользователя" в режиме регистрации
Я работаю над процессом регистрации в Django, где пользователи получают токенизированную ссылку для завершения своей регистрации. В ходе процесса я связываю экземпляр UserProfile
с пользователем, используя get_or_create()
. Однако я сталкиваюсь с ошибкой, указывающей на то, что необходимо установить username
.
from django.contrib.auth import get_user_model
from django.contrib.auth.tokens import default_token_generator
from django.utils.http import urlsafe_base64_decode
from django.shortcuts import render, redirect
from django.contrib import messages
from .models import UserProfile
from .forms import RegistrationForm
User = get_user_model()
def complete_registration_step1(request, uidb64, token):
try:
uid = urlsafe_base64_decode(uidb64).decode()
user = User.objects.get(pk=uid)
# Check if the token is valid and hasn't been used
if user.token_used or not default_token_generator.check_token(user, token):
messages.error(request, "The confirmation link is invalid or expired.")
return redirect('home')
except (TypeError, ValueError, OverflowError, User.DoesNotExist):
user = None
if user is not None:
if request.method == 'POST':
form = RegistrationForm(request.POST)
if form.is_valid():
user_profile, created = UserProfile.objects.get_or_create(user=user) # Error occurs here
form_instance = form.save(commit=False)
user_profile.first_name = form_instance.first_name
user_profile.birth_date = form_instance.birth_date
user_profile.gender = form_instance.gender
user_profile.save()
messages.success(request, "First step of registration completed.")
# return redirect('complete_registration_step2', uidb64=uidb64, token=token)
else:
form = RegistrationForm()
return render(request, 'registration/complete_registration.html', {'form': form})
else:
messages.error(request, "User does not exist.")
return redirect('home')
from django.contrib.auth.models import AbstractUser, BaseUserManager
from django.db import models
class CustomUserManager(BaseUserManager):
def create_user(self, email, username=None, password=None, **extra_fields):
if not email:
raise ValueError("Email is required")
if not username:
username = email
email = self.normalize_email(email)
user = self.model(email=email, username=username, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, username, password=None, **extra_fields):
extra_fields.setdefault("is_staff", True)
extra_fields.setdefault("is_superuser", True)
return self.create_user(email, username, password, **extra_fields)
class CustomUser(AbstractUser):
username = models.CharField(max_length=150, unique=True, blank=True, null=True)
email = models.EmailField(unique=True)
objects = CustomUserManager()
def save(self, *args, **kwargs):
if self.email and not self.username:
self.username = self.email
super().save(*args, **kwargs)
class UserProfile(models.Model):
user = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
first_name = models.CharField(max_length=100, blank=True, null=True)
birth_date = models.DateField(blank=True, null=True)
gender = models.CharField(max_length=10, blank=True, null=True)
ValueError: для данного имени пользователя должно быть установлено значение
UserProfile
корректно связан сCustomUser
с помощью OneToOneField.Поле
username
вCustomUser
необязательно, и я ожидаю, что оно будет установлено автоматически с помощью поляemail
.Ошибка возникает по адресу
UserProfile.objects.get_or_create(user=user)
, но я не уверен, почему это вызывает проблему сusername
.
Как я могу устранить эту проблему и убедиться, что пользователь сможет правильно завершить регистрацию?
Способ запроса:ОТПРАВИТЬ
Версия Django:5.1.3
Тип исключения:ValueError
Значение исключения: для данного имени пользователя должно быть установлено значение
Спасибо