0

I ran into a problem I am making a job search site on Django, I have the following logic:

  1. Authorization and authentication of ordinary job seekers using Django's built-in model - User
  2. Also separate authorization and authentication for users who provide work, i.e. employers, which are placed in my own model Employer

Here is my Employer model

class Employer(AbstractUser):
    full_name = models.CharField(max_length=150, verbose_name="Ім'я")
    main_office_city = models.ForeignKey(City, on_delete=models.CASCADE,
                                         verbose_name='Місто головного офісу')
    phone_number = models.ForeignKey(Phone, on_delete=models.CASCADE)
    email = models.CharField(max_length=50, unique=True, verbose_name='Email')
    hashed_password = models.CharField(max_length=120, default='')
    date_joined = models.DateTimeField(verbose_name='Дата реєстрації',
                                       default=timezone.now)

    def __str__(self):
        return self.full_name

    class Meta:
        verbose_name = 'Роботодавець'
        verbose_name_plural = 'Роботодавці'

I read in the documentation that to create your own authentication system you can use the imitation from the AbstractUser class But in my case this is not the best choice, because AbstractModel adds its own fields by default. That is, I think that I need to either somehow make it so that the AbstractUser class does not add its fields, or think of some other authentication logic using another technology

Maybe someone has some ideas how it can be done?

starball
  • 20,030
  • 7
  • 43
  • 238
Dimaapp
  • 123
  • 1
  • 1
  • 7

1 Answers1

0

if you want to change ilt-in User model add custom user model in django follow below steps

models.py

from django.db import models
from django.contrib.auth.models import (AbstractBaseUser, BaseUserManager, PermissionsMixin)
from django.utils.translation import gettext as _
from django.utils import timezone
# Create your models here.
class EmployerUserManager(BaseUserManager):

    use_in_migrations = True

    def _create_user(self, email, password, **extra_fields):
        values = [email]
        field_value_map = dict(zip(self.model.REQUIRED_FIELDS, values))
        for field_name, value in field_value_map.items():
            if not value:
                raise ValueError("The {} value must be set".format(field_name))

        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        
        return user

    def create_user(self, email, password=None, **extra_fields):
        extra_fields.setdefault("is_staff", False)
        extra_fields.setdefault("is_superuser", False)
        return self._create_user(email, password, **extra_fields)

    def create_superuser(self, email, password=None, **extra_fields):
        extra_fields.setdefault("is_staff", True)
        extra_fields.setdefault("is_superuser", True)

        if extra_fields.get("is_staff") is not True:
            raise ValueError("Superuser must have is_staff=True.")
        if extra_fields.get("is_superuser") is not True:
            raise ValueError("Superuser must have is_superuser=True.")

        return self._create_user(email, password, **extra_fields)


class Employer(AbstractBaseUser, PermissionsMixin):
    username = None
    full_name = models.CharField(max_length=150, verbose_name="Ім'я")
    main_office_city = models.ForeignKey(City, on_delete=models.CASCADE,
                                         verbose_name='Місто головного офісу')
    phone_number = models.ForeignKey(Phone, on_delete=models.CASCADE)
    email = models.CharField(max_length=50, unique=True, verbose_name='Email')
    hashed_password = models.CharField(max_length=120, default='')
    date_joined = models.DateTimeField(verbose_name='Дата реєстрації',
                                       default=timezone.now)

    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = ['full_name']

    objects = EmployerUserManager()

    def __str__(self):
        return self.email

settings.py

AUTH_USER_MODEL = 'myapp.EmployerUser'

---> delete database(db.sqlite3) also delete migrations folder

---> run command (python manage.py makemigrations app_name)

---> run command (python manage.py migrate)

views.py

from django.shortcuts import render,redirect
from .form import UserLoginForm
from django.contrib import messages
from django.contrib.auth import authenticate,login,logout
from .models import Employer

def SigninView(request):
    if request.method == 'POST':
        email = request.POST.get('email')
        upass = request.POST.get('password')
        user = authenticate(email=email,password=upass)
        if user is None:
            messages.error(request,'Please Enter Correct Credinatial')
            return redirect('/signin/')
        else:
            login(request,user)
            messages.success(request,'Login Successful')
        return redirect('/shop/')
    else:
        if request.user.is_authenticated:
            return redirect('/shop/')
        else:
            return render(request,'signin.html',{'form':form})