Search code examples
pythondjango-modelsdjango-signals

Using signal to create group with username


I am trying to create a group for each new user using signals.py

Signals.py is looking like that :

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

and my models.py

class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
group = models.OneToOneField(Group, null=True, blank=True, on_delete=models.CASCADE)
manager = models.BooleanField(default=False)
first_visit = models.BooleanField(default=True)

How do I set a default group with a the name of the user ? Something lile "Groupe of [user]" ?


Solution

  • You can first construct (or retrieve) a group with as name the name of the user, and then set that group in the profile you create:

    @receiver(post_save, sender=User)
    def create_profile(sender, instance, created, **kwargs):
    if created:
        group, __ = Group.objects.get_or_create(name='Group of {}'.format(instance.username))
        Profile.objects.create(user=instance, group=group)
        instance.groups.add(group)

    You however might want to use .create(..) over get_or_create(..) to prevent users from registering as 'admin' for example, to get automatically registered in a (possibly) already existing group Group of admin.