You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 21:23:12