Home > Blockchain >  Overwriting save method to create entry in related table automatically django
Overwriting save method to create entry in related table automatically django

Time:09-27

After registration email with email confirmation is sent to a new user. I created model UserWithConfirmation with new field is_email_confirmed. I was following this https://docs.djangoproject.com/en/4.1/topics/auth/customizing/#extending-the-existing-user-model.

I want to have UserWithConfirmation created for each new user when user is saved. For now I have sth like this.

from django.db import models
from django.contrib.auth.models import User


class UserWithConfirmation(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="user_with_confirmation")
    is_email_confirmed = models.BooleanField(default=False)

    def __str__(self):
        return self.user.username


class User:
    def save(self, *args, **kwargs):

        super().save(*args, **kwargs)
        create_user_with_confirmation(User)


def create_user_with_confirmation(user):
    UserWithConfirmation(user=user)
    UserWithConfirmation.save()

How to make it works?

CodePudding user response:

Just have UserWithConfirmation extend User

class UserWithConfirmation(User):
    is_email_confirmed = models.BooleanField(default=False)

and change the entry when the email is confirmed

CodePudding user response:

I solved my problem using signals I changed UserWithConfirmation to Profile

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="profile")
    is_email_confirmed = models.BooleanField(default=False)


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


@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()
  • Related