Home > Mobile >  How can I add aditional conditions in Django Login
How can I add aditional conditions in Django Login

Time:05-08

I want my login function to classify If user is an one-to-one field in Alumni or Personel table.

If user is related to Alumni table, log the user in and redirect to profile page.

If user is related to Personel table, log the user in and redirect to another page.

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})

CodePudding user response:

You could check for the instance being available in the table like so:

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})

Note that this assumes that each user is either related to Alumni or Personel. Also make sure to use the common naming convention for your model fields being lowercase.

CodePudding user response:

you can have a type field in user object.

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,
    )

and add this in your settings.py

AUTH_USER_MODEL = '{YOUR_APP_NAME}.{YOUR_USER_MODEL}'

then, each time a user log in you can check for the type.

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})
  • Related