I am working on an intranet web application which needs two types of users. Normal users that can be setup from django admin and specific type of users - Employees.
I have the following model for Employee type user.
class Employee(models.Model):
emp_name = models.CharField(max_length=500)
slug = models.SlugField(unique=True, default='')
location = models.CharField(max_length=200)
email = models.EmailField()
experience = models.TextField(blank=True)
primary_skill = models.ManyToManyField(PrimarySkill)
secondary_skill = models.ManyToManyField(SecondarySkill)
I tried having a OneToOneField like this as per the official doc and this article:
user = models.OneToOneField(User, blank=True, null=True, on_delete=models.CASCADE)
@receiver(post_save, sender=User)
def create_employee(sender, instance, created, **kwargs):
if created:
Employee.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_employee(sender, instance, **kwargs):
instance.employee.save()
I realized that this is the opposite of what I want. Every time a User is created from the admin, there was an entry created in the app_employee table.
What I want is this:
- Every time an
Employee
is created, I need aUser
created. - An Employee can be created using a separate signup form, say emp_signup
How do I approach this scenario?
I have achieved this using a custom user based on
AbstractUser
inspired by this article.In settings.py, I then add the following key:
And wherever I need to refer the User class, I use
get_user_model()
, which will substitute our custom user, in views and forms as follows:views.py
forms.py