Django自定义登录模板异常:仅管理员可登录且跳转至后台
问题分析与解决方案
一、普通用户/员工无法登录的问题
核心原因
- 自定义用户模型
Account的is_active字段默认值为False,而UserManager.create_user方法未主动设置用户为活跃状态,Django拒绝未激活用户登录。 create_user方法存在字段名错误:参数roll_no被赋值给不存在的roll_no字段,模型中实际字段为roll_number,导致用户创建时字段不匹配。
修改方案
修改manager.py中的create_user方法:
def create_user( self, email, first_name, last_name, roll_no, password, department=None ): if not email: raise ValueError("User requires an Email") if not first_name: raise ValueError("User requires a First name") if not roll_no: raise ValueError("User requires a Roll Number") user = self.model( email=self.normalize_email(email), first_name=first_name, last_name=last_name, roll_number=roll_no, # 修正字段名匹配模型 department=department, is_active=True, # 强制激活新用户 ) user.set_password(password) user.save(using=self._db) return user
二、登录后跳转至后台而非Web应用的问题
核心原因
CustomLoginView中设置了success_url = reverse_lazy("dashboard"),直接覆盖了全局配置LOGIN_REDIRECT_URL = "blogs",导致所有登录用户跳转到dashboard(若管理员用户无此路由,会默认跳转到admin后台)。
修改方案
修改views.py中的CustomLoginView,移除自定义的success_url或改为与全局配置一致:
class CustomLoginView(LoginView): model = Account form_class = CustomLoginForm redirect_authenticated_user: bool = True template_name: str = "accounts/login.html" # 移除原success_url,自动使用settings中的LOGIN_REDIRECT_URL # 或手动指定为目标路由:success_url = reverse_lazy("blogs")
若需强制所有用户(包括管理员)登录后跳转到blogs,可重写get_success_url方法:
class CustomLoginView(LoginView): model = Account form_class = CustomLoginForm redirect_authenticated_user: bool = True template_name: str = "accounts/login.html" def get_success_url(self): return reverse_lazy("blogs")
三、额外检查项
- 确认
settings.py中LOGIN_REDIRECT_URL = "blogs"对应的路由在项目总urls.py中已正确配置且名称匹配。 - 运行
python manage.py makemigrations和python manage.py migrate,确保管理器逻辑修改生效(无需修改模型字段,仅需同步数据)。 - 测试新注册用户的
is_active字段是否为True,验证登录功能是否正常。
内容的提问来源于stack exchange,提问作者Dhruv
相关产品推荐
相关产品推荐

