Как я могу автоматически заполнять поля для новых пользователей, которые регистрируются в django?

У меня возникла проблема с автоматическим заполнением полей для новых пользователей, которые регистрируются в django. Я не знаю, как я могу получить некоторую информацию.

Итак, это моя модель профиля

class Profile(models.Model):
    user = models.ForeignKey(MyUser, null=True, on_delete=models.CASCADE)
    name = models.CharField(max_length=45)
    last_name = models.CharField(max_length=60)
    profile_picture = models.ImageField(default='profile_pics/Default.jpg', upload_to='profile_pics')

    def __str__(self):
        return f'{self.user.first_name} {self.user.last_name}'

это функция, которая автоматически создает Профиль.

@receiver(post_save, sender=MyUser)
def create_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

а это модель MyUser, которую я использую.

class CustomUserManager(BaseUserManager):

    def _create_user(self, email, password, first_name, last_name, mobile, **extra_fields):
        if not email:
            raise ValueError("Email must be provided")
        if not password:
            raise ValueError("Password is not provided")

        user = self.model(
            email= self.normalize_email(email),
            first_name = first_name,
            last_name = last_name,
            mobile = mobile,
            **extra_fields
        )
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, email, password, first_name, last_name, mobile, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_active', True)
        extra_fields.setdefault('is_superuser', False)
        return self._create_user(email, password,first_name, last_name, mobile, **extra_fields)

    def create_superuser(self, email, password, first_name, last_name, mobile, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_active', True)
        extra_fields.setdefault('is_superuser', True)
        return self._create_user(email, password, first_name, last_name, mobile, **extra_fields)


class MyUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(db_index=True, unique=True, max_length=254)
    first_name = models.CharField(max_length=240)
    last_name = models.CharField(max_length=240)
    mobile = models.CharField(max_length=50)


    is_staff = models.BooleanField(default=True)
    is_active = models.BooleanField(default=True)
    is_superuser = models.BooleanField(default=False)

    objects= CustomUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name', 'last_name', 'mobile']

Мне интересно, как я могу получить первое_имя и второе_имя от пользователя, который регистрируется, и отправить их в функцию create_profile, чтобы она автоматически добавила первое_имя и второе_имя в профиль.

Вы можете послать first_name и last_name в Профиль через ваш сигнал следующим образом:

@receiver(post_save, sender=MyUser)
def create_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance, name=instance.first_name, last_name=instance.last_name)

Также, имеет ли модель Profile отношение ForeignKey специально? Если нет, я бы рассмотрел возможность изменить его на models.OneToOneField, иначе это подразумевает, что один пользователь может иметь несколько профилей

class Profile(models.Model):
   user = models.OneToOneField(MyUser, null=True, on_delete=models.CASCADE)
   ...
Вернуться на верх