如何解决如何在 django 网站中创建两种类型的用户,重写身份验证后端
所以,这就是我尝试创建两个模型的方式:
class UserManager(BaseUserManager):
def create_user(self,email,username,year,branch,rollNo,password=None):
if not email:
raise ValueError("Users must have an email")
if not username:
raise ValueError("Users must have a username")
if not year:
raise ValueError("Users must specify an year")
if not branch:
raise ValueError("Users must specify a branch")
if not rollNo:
raise ValueError("Users must have a roll number")
user = self.model(
email=self.normalize_email(email),username=username,year=year,branch=branch,rollNo=rollNo
)
user.set_password(password)
user.save(using=self._db)
return user
def create_guest(self,college,password=None):
if not username:
raise ValueError("Please give a valid username")
if not college:
raise ValueError("Please provide your college")
if not year:
raise ValueError("Specify your year")
if not email:
raise ValueError("A valid email needs to be provided")
user = self.model(
email = self.normalize_email(email),username = username,year = year,college = college
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self,password):
user = self.model(
email=self.normalize_email(email),rollNo=rollNo,password=password
)
user.is_admin = True
user.is_staff = True
user.is_superuser = True
user.set_password(password)
user.save(using=self._db)
return user
class GuestUser(AbstractBaseUser):
email = models.EmailField(unique=True)
username = models.CharField(max_length=30,unique=True)
date_joined = models.DateTimeField(verbose_name='date_joined',auto_now_add=True)
last_login = models.DateTimeField(verbose_name='last_login',auto_now_add=True)
is_admin = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
year = models.IntegerField(validators=[MaxValueValidator(4),MinValueValidator(1)],blank=False)
college = models.CharField(max_length=50)
guest = models.BooleanField(default=True)
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email','username','year','college']
objects = UserManager()
def __str__(self):
return self.email + " - " + self.username
def has_perm(self,perm,obj=None):
return self.is_admin
def has_module_perms(self,app_label):
return True
class User(AbstractBaseUser):
email = models.EmailField(unique=True)
username = models.CharField(max_length=30,blank=False)
Branch_CHOICES = (
('1','CSE'),('2','ECE'),('3','IT')
)
branch = models.CharField(max_length=3,choices=Branch_CHOICES)
rollNo = models.CharField(validators=[MinLengthValidator(5)],max_length=5,unique=True)
USERNAME_FIELD = 'rollNo'
REQUIRED_FIELDS = ['email','branch']
objects = UserManager()
def __str__(self):
return self.rollNo + " - " + self.username
def has_perm(self,app_label):
return True
这是我的身份验证后端文件:
from django.contrib.auth.backends import BaseBackend
from events.models import User,GuestUser
class authBackend(BaseBackend):
def authenticate(self,request,password):
try:
user = User.objects.get(rollNo=username)
success = user.check_password(password)
if success:
return user
except User.DoesNotExist:
pass
try:
user = GuestUser.objects.get(username=username)
success = user.check_password(password)
if success:
return user
except GuestUser.DoesNotExist:
pass
return None
def get_user(self,uid):
try:
return User.objects.get(pk=uid)
except:
return None
“用户”模型工作正常,但我的“GuestUser”登录视图无法正常工作,这是我的观点:
def guest_login(request):
if request.method == "POST":
# Attempt to sign user in
username = request.POST["username"]
password = request.POST["password"]
user = authenticate(request,password=password)
# Check if authentication successful
if user is not None:
login(request,user)
return HttpResponseRedirect(reverse("events:index"))
else:
return render(request,"events/guest_login.html",{
"message": "Invalid roll number and/or password."
})
else:
return render(request,"events/guest_login.html")
我认为问题出在我的“身份验证”函数中,我想要做的是获取“用户”对象并登录,如果用户对象为无,则获取“GuestUser”对象。但这显然不起作用,因为当我提交表单时,我被重定向到“success_url”,但用户没有登录。有人可以帮我吗??
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。