Django替换默认用户模型后注册报错:AttributeError: Manager不可用
问题描述
注册新用户并添加到组时出现错误:AttributeError: Manager isn't available; 'auth.User' has been swapped for 'main.CustomUser',自修改用户模型(添加point字段并执行迁移)后注册功能失效。
相关代码
models.py
class CustomUser(AbstractUser): point = models.IntegerField(default=0) class App(models.Model): appname = models.CharField(max_length=255) link = models.CharField(max_length=100) category= models.CharField(max_length=100) subcategory = models.CharField(max_length=100) points = models.IntegerField() created_at = models.DateTimeField(auto_now_add=True, null=True) appicon = models.ImageField(upload_to='icon/') def __str__(self): return self.appname
注册视图
def sign_up(request): if request.method == "POST": form = RegisterForm(request.POST) if form.is_valid(): user = form.save() user_group, created = Group.objects.get_or_create(name='user') user.groups.add(user_group) login(request, user) return redirect('/app') else: form = RegisterForm() return render(request,'registration/signup.html', {'form':form})
settings.py配置
AUTH_USER_MODEL = 'main.CustomUser'
报错回溯
Internal Server Error: /app/signup/ Traceback (most recent call last): File "D:\01 tasks\pro 2 and try outs\django main\venv\Lib\site-packages\django\core\handlers\exception.py", line 55, in inner response = get_response(request) ^^^^^^^^^^^^^^^^^^^^^ File "D:\01 tasks\pro 2 and try outs\django main\venv\Lib\site-packages\django\core\handlers\base.py", line 197, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\01 tasks\pro 2 and try outs\django main\main\views.py", line 87, in sign_up if form.is_valid(): ^^^^^^^^^^^^^^^ File "D:\01 tasks\pro 2 and try outs\django main\venv\Lib\site-packages\django\forms\forms.py", line 197, in is_valid return self.is_bound and not self.errors ^^^^^^^^^^^ File "D:\01 tasks\pro 2 and try outs\django main\venv\Lib\site-packages\django\forms\forms.py", line 192, in errors self.full_clean() File "D:\01 tasks\pro 2 and try outs\django main\venv\Lib\site-packages\django\forms\forms.py", line 327, in full_clean self._clean_fields() File "D:\01 tasks\pro 2 and try outs\django main\venv\Lib\site-packages\django\forms\forms.py", line 342, in _clean_fields value = getattr(self, "clean_%s" % name)() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\01 tasks\pro 2 and try outs\django main\venv\Lib\site-packages\django\contrib\auth\forms.py", line 163, in clean_username and self._meta.model.objects.filter(username__iexact=username).exists() ^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\01 tasks\pro 2 and try outs\django main\venv\Lib\site-packages\django\db\models\manager.py", line 196, in __get__ raise AttributeError( AttributeError: Manager isn't available; 'auth.User' has been swapped for 'main.CustomUser'
解决方案
错误根源是你使用的RegisterForm大概率是默认的UserCreationForm,它硬关联了auth.User模型,而你已经在settings中替换为自定义的CustomUser,导致表单验证时调用了已被弃用的auth.User的manager。
解决步骤:
- 自定义注册表单
在你的app下创建forms.py,编写适配自定义用户模型的表单:
from django.contrib.auth.forms import UserCreationForm from django.contrib.auth import get_user_model class RegisterForm(UserCreationForm): class Meta: model = get_user_model() # 动态获取当前配置的用户模型 fields = ('username', 'email', 'password1', 'password2') # 根据需求添加字段
- 更新视图导入
确保视图中导入的是你自定义的RegisterForm,而不是默认的表单:
from .forms import RegisterForm # 替换原来的导入
- 验证迁移
确保所有迁移已正确执行:
python manage.py makemigrations python manage.py migrate
这样修改后,表单会正确关联你的CustomUser模型,验证时调用正确的manager,错误即可解决。用户添加组的逻辑无需修改,因为AbstractUser已经自带groups关联字段,和Group模型的交互是正常的。
内容的提问来源于stack exchange,提问作者rohit10
相关产品推荐
相关产品推荐

