Django自定义User模型报错:Manager不可用,auth.User已替换为hospital.User
解决Django自定义User模型后使用UserCreationForm的AttributeError问题
错误原因
UserCreationForm是Django内置表单,默认绑定auth.User模型。当你通过AUTH_USER_MODEL将默认用户模型替换为自定义的hospital.User后,该表单仍会尝试调用原auth.User的管理器,从而触发Manager isn't available; 'auth.User' has been swapped for 'hospital.User'错误。
解决方案
1. 自定义用户创建表单
在hospital应用下新建forms.py,继承UserCreationForm并指定自定义模型:
from django.contrib.auth.forms import UserCreationForm from .models import User class CustomUserCreationForm(UserCreationForm): class Meta: model = User # 根据自定义模型字段,指定注册所需的必填字段 fields = ('username', 'first_name', 'last_name', 'gender', 'user_type', 'password1', 'password2')
注:你的
User模型中username被设为EmailField,且REQUIRED_FIELDS为空,需确保表单包含所有注册时必须填写的字段。
2. 修改注册视图的表单类
将视图中的form_class替换为自定义表单,同时修复已认证用户的跳转循环问题:
from django.contrib.auth import login from django.views.generic.edit import FormView from django.urls import reverse_lazy from django.shortcuts import redirect from .forms import CustomUserCreationForm class UserRegisterView(FormView): template_name = 'register.html' form_class = CustomUserCreationForm # 替换为自定义表单 redirect_authenticated_user = True success_url = reverse_lazy('dashboard') def form_valid(self, form): user = form.save() if user is not None: login(self.request, user) return super().form_valid(form) def get(self, *args, **kwargs): if self.request.user.is_authenticated: return redirect(self.success_url) # 避免循环跳转,直接跳转到成功页 return super().get(*args, **kwargs)
3. 确认配置正确性
检查项目settings.py中是否正确设置了自定义用户模型:
AUTH_USER_MODEL = 'hospital.User'
原理说明
通过自定义表单绑定你的User模型,让表单内部逻辑调用自定义模型的管理器,而非默认的auth.User管理器,从根源上解决管理器不可用的错误。
内容的提问来源于stack exchange,提问作者abu abu
相关产品推荐
相关产品推荐

