Create a separate user type

310 Views Asked by At

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 a User created.
  • An Employee can be created using a separate signup form, say emp_signup

How do I approach this scenario?

1

There are 1 best solutions below

0
On BEST ANSWER

I have achieved this using a custom user based on AbstractUser inspired by this article.

class CustomUser(AbstractUser):
    pass

class Employee(CustomUser):
    user = models.OneToOneField(settings.AUTH_USER_MODEL)
    # other fields

In settings.py, I then add the following key:

AUTH_USER_MODEL = 'myapp.CustomUser'

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

from django.contrib.auth import get_user_model

def user_profile(request):
    User = get_user_model()
    user = get_object_or_404(User, username=request.user.username)
    return render(request, 'user/user_profile.html', {
        'site_user': user
    })

forms.py

class SignUpForm(UserCreationForm):

    class Meta:
        model = get_user_model()
        fields = ('username', 'email', 'password1', 'password2',)