How can i automatically fill fields for new users that register django?

Question:

i have got a problem with automatically filling fields for new users that register in django. I don’t know how can i get some informations.

so this is my Profile Model

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}'

this is the function that automatically creates Profile.

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

and this is MyUser model that i use.

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']

I was wondering how can i get first_name and second_name from the user who registers and send it into create_profile function so it will add first_name and second_name automatically to the Profile.

Asked By: Bartosz

||

Answers:

You can send first_name and last_name to Profile via your signal like this:

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

Also, does Profile model has ForeignKey relationship on purpose? If not, I would consider changing it to models.OneToOneField, otherwise, it implies that one user can have multiple profiles

class Profile(models.Model):
   user = models.OneToOneField(MyUser, null=True, on_delete=models.CASCADE)
   ...
Answered By: Daniil456
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.