Django注册报错AttributeError:auth.User已替换为accounts.User
解决AttributeError: Manager isn't available; 'auth.User' has been swapped for 'accounts.User'错误
问题根源
注册视图中使用的Django自带UserCreationForm默认依赖系统原生auth.User模型,但你的项目已通过AUTH_USER_MODEL将用户模型替换为accounts.User,导致该表单仍尝试访问已被替换的auth.User管理器,触发错误。
解决方案
1. 创建自定义用户注册表单
在accounts应用下新建forms.py文件,编写基于自定义用户模型的注册表单:
from django.contrib.auth.forms import UserCreationForm from django.contrib.auth import get_user_model class CustomUserCreationForm(UserCreationForm): class Meta: model = get_user_model() fields = ('email',)
2. 修改注册视图,使用自定义表单
更新accounts/views.py,替换原有的UserCreationForm为自定义表单:
from django.shortcuts import render, redirect from django.contrib.auth import login as auth_login from django.contrib.auth import authenticate from .forms import CustomUserCreationForm from django.contrib import messages def register(request): if request.method == 'POST': form = CustomUserCreationForm(request.POST) if form.is_valid(): form.save() messages.success(request, 'Registration successful. You can now log in.') return redirect('login') else: form = CustomUserCreationForm() return render(request, 'register.html', {'form': form}) def login_view(request): if request.method == 'POST': email = request.POST['email'] password = request.POST['password'] user = authenticate(request, username=email, password=password) if user is not None: auth_login(request, user) return redirect('homepage') else: messages.error(request, 'Invalid email or password') return render(request, 'login.html')
3. 确认settings.py配置
确保项目根目录的settings.py中已正确配置自定义用户模型:
AUTH_USER_MODEL = 'accounts.User'
额外优化(可选)
在login_view中,可直接传递email参数给authenticate,匹配自定义后端的参数设计,更直观:
user = authenticate(request, email=email, password=password)
内容的提问来源于stack exchange,提问作者Mayank Painkra
相关产品推荐
相关产品推荐

