Lucas Terças
Lucas Terças

Reputation: 11

Django: authtools do create the user profile when the user is created

I am using the authtools plugin to manage the user and its profile in django, but when I create the user, it does not create its profile, I have to go to the admin part of the site and create it manually.

I separated the applications into account and profile.

This is the profiles model:

class Profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL,
                                on_delete=models.CASCADE,
                                primary_key=True)
    slug = models.UUIDField(default=uuid.uuid4, blank=True, editable=False)
    email_verified = models.BooleanField("Email verified", default=True)

This is the signal.py, that is inside of the profiles application:

@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_profile_handler(sender, instance, created, **kwargs):
    if not created:
        return
    profile = models.Profile(user=instance)
    profile.save()
    logger.info('New user profile for {} created'.format(instance))

This is the admin.py of the account app:

class UserProfileInline(admin.StackedInline):
    model = Profile


class NewUserAdmin(NamedUserAdmin):
    inlines = [UserProfileInline]
    list_display = ('is_active', 'email', 'name', 'permalink',
                    'is_superuser', 'is_staff',)

    # 'View on site' didn't work since the original User model needs to
    # have get_absolute_url defined. So showing on the list display
    # was a workaround.
    def permalink(self, obj):
        url = reverse("profiles:show",
                      kwargs={"slug": obj.profile.slug})
        # Unicode hex b6 is the Pilcrow sign
        return format_html('<a href="{}">{}</a>'.format(url, '\xb6'))


admin.site.unregister(User)
admin.site.register(User, NewUserAdmin)
admin.site.register(Profile)

When I signup a user, both the user and the profile objects are created, only they are not linked. Why is that?

Thank you

Upvotes: 1

Views: 242

Answers (1)

Ishwar Jangid
Ishwar Jangid

Reputation: 317

Use this below your profile model in models.py. I hope you are generating slug by another slugify signal.

def user_created_receiver(sender, instance, created, *args, **kwargs):
    if created:
        Profile.objects.get_or_create(user = instance)
post_save.connect(user_created_receiver, sender = User)

Upvotes: 1

Related Questions