Как я могу добавить дополнительные условия в Django Login

Я хочу, чтобы моя функция входа классифицировала, если user является one-to-one field в Alumni или Personel таблице.

Если user связана с таблицей Alumni, авторизуйте пользователя и перенаправьте его на страницу профиля.

Если user связана с таблицей Personel, авторизуйте пользователя и перенаправьте на другую страницу.

model.py

class Alumni(models.Model):
    Alumni_id = models.IntegerField(primary_key=True)
    User_id = models.OneToOneField(User,on_delete=models.CASCADE)
    Name = models.CharField(max_length=50 , null=True)
    Surname = models.CharField(max_length=50 , null=True)
    image = models.ImageField(default = 'default.jpg',upload_to='profile_pic')
    LinkedIn = models.CharField(max_length=256 , null=True , blank=True)
    Line = models.CharField(max_length=50 , null=True  , blank=True)
    Email = models.EmailField(max_length=50 , null=True  , blank=True)
    Province = models.CharField(max_length=50)
    District = models.CharField(max_length=50)
    Sub_District = models.CharField(max_length=50)
    Postal_code = models.IntegerField()
    Address = models.CharField(max_length=50, null=True , blank=True)
    PhoneNumber = models.IntegerField( null=True)
    def __str__(self):
        return ("Alumni id:%s" %(self.User_id))
    def get_absolute_url(self):
        from django.urls import reverse
        return reverse('Alumni_detail', args=[str(self.Alumni_id)])

class Personel(models.Model):
    Personel_id = models.IntegerField(primary_key=True)
    User_id = models.OneToOneField(User,on_delete=models.CASCADE)
    Name = models.CharField(max_length=50 , null=True)
    Surname = models.CharField(max_length=50 , null=True)
    Email = models.EmailField(max_length=50 , null=True  , blank=True)

view.py

def loginpage(request):
    if request.method =='POST':
        form = AuthenticationForm(data=request.POST)
        if form.is_valid():
            user = form.get_user()
            login(request,user)
            return redirect('/profile')
    else:
        form = AuthenticationForm()
    return render(request,'login.html',{'form':form})

Вы можете проверить наличие экземпляра в таблице следующим образом:

def loginpage(request):
    if request.method =='POST':
        form = AuthenticationForm(data=request.POST)
        if form.is_valid():
            user = form.get_user()
            login(request.user)

            # Check here
            try:
               is_alumni = Alumni.objects.get(User_Id=user)
               return redirect('/profile')
            except:
               return redirect('/other-page')
    else:
        form = AuthenticationForm()
    return render(request,'login.html',{'form':form})

Обратите внимание, что здесь предполагается, что каждый пользователь связан с Alumni или Personel. Также убедитесь, что вы используете общепринятое соглашение об именовании полей вашей модели в нижнем регистре.

вы можете иметь поле типа в объекте пользователя.

yourapp/models.py

from django.contrib.auth.models import AbstractUser

USER_TYPE = (
    (1, 'Alumni'),
    (2, 'Personel'),
)

class User(AbstractUser):
    user_type = models.PositiveSmallIntegerField(
        choices=USER_TYPE,
        default=1,
    )

и добавьте это в ваш settings.py

AUTH_USER_MODEL = '{YOUR_APP_NAME}.{YOUR_USER_MODEL}'

тогда, каждый раз, когда пользователь входит в систему, вы можете проверить тип.

yourapp/views.py

def login(request) :
    if request.method =='POST':
        form = AuthenticationForm(data=request.POST)
        if form.is_valid():
            user = form.get_user()
            login(request.user)

            # Check here
            if user.user_type == 1 :
                return redirect('alumni')
            elif user.user_type == 2 :
                return redirect('personel')
    else:
        form = AuthenticationForm()
    return render(request,'login.html',{'form':form})
Вернуться на верх