Django自定义User模型无法登录,仅auth_user账号可正常登录求助
解决方案
1. 配置Django使用自定义用户模型
在项目根目录的settings.py中添加以下配置,告知Django使用你自定义的用户模型:
AUTH_USER_MODEL = 'function.User'
注意:该配置必须在首次执行数据库迁移前设置。如果已经生成过迁移文件,需要删除应用
migrations目录下除__init__.py外的所有文件,然后重新执行python manage.py makemigrations和python manage.py migrate,否则Django会继续沿用默认的auth_user数据表。
2. 自定义登录表单
默认的AuthenticationForm是基于Django内置User模型开发的,无法适配你的自定义模型。在应用的forms.py中创建自定义登录表单:
from django.contrib.auth.forms import AuthenticationForm from .models import User class CustomAuthenticationForm(AuthenticationForm): class Meta: model = User fields = ('username', 'password')
3. 修正登录视图逻辑
原视图存在两个问题:GET请求时错误传入空的request.POST初始化表单,以及使用默认表单无法识别自定义用户。修改后的视图如下:
from django.contrib import auth from django.http import HttpResponseRedirect from django.shortcuts import render from .forms import CustomAuthenticationForm def log_in(request): # GET请求时初始化空表单 form = CustomAuthenticationForm() if request.method == "POST": form = CustomAuthenticationForm(data=request.POST) if form.is_valid(): # 通过表单获取已验证的用户对象 user = form.get_user() if user.is_active: auth.login(request, user) return HttpResponseRedirect('/index') context = { 'form': form, } return render(request, 'login.html', context)
4. 确认用户管理器的完整性
自定义用户模型必须搭配实现了create_user和create_superuser方法的管理器,确保你的AccountManager类代码如下:
from django.contrib.auth.models import BaseUserManager class AccountManager(BaseUserManager): def create_user(self, username, email, date_of_birth, password=None): if not email: raise ValueError('用户必须填写邮箱') if not username: raise ValueError('用户必须填写用户名') user = self.model( email=self.normalize_email(email), username=username, date_of_birth=date_of_birth, ) user.set_password(password) user.save(using=self._db) return user def create_superuser(self, username, email, date_of_birth, password): user = self.create_user( username=username, email=email, password=password, date_of_birth=date_of_birth, ) user.is_admin = True user.save(using=self._db) return user
问题根源
你遇到的核心问题是未告知Django使用自定义用户模型,导致auth模块默认去auth_user表查询用户,而你的自定义账号存储在function_user表中,自然无法匹配。配置AUTH_USER_MODEL后,所有auth相关操作都会转向你的自定义模型,结合适配的登录表单,就能实现自定义账号的正常登录。
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

