Как я могу добавить дополнительные условия в 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})