Django报错:无法赋值<User: someuser>,UserProfileInfo.user需为User实例
解决Django错误:Cannot assign "<User: someuser>": "UserProfileInfo.user" must be a "User" instance
错误详情
在创建用户及关联用户资料时触发以下错误:
Cannot assign "<User: someuser>": "UserProfileInfo.user" must be a "User" instance
相关代码
Views.py
from django.contrib.auth import get_user_model from django.shortcuts import render from django.urls import reverse_lazy from django.views.generic import CreateView,FormView from . import forms def signup(request): if request.method =='POST': user_create_form = forms.UserCreateForm(data=request.POST) user_profile_form = forms.UserProfileInfoForm(data=request.POST) if user_create_form.is_valid() and user_profile_form.is_valid(): user = user_create_form.save() user.save() profile = user_profile_form.save(commit=False) profile.user = user if 'profile_pic' in request.FILES: profile.profile_pic = request.FILES['profile_pic'] profile.save() else: print(user_create_form.errors,user_profile_form.errors) else: user_create_form = forms.UserCreateForm() user_profile_form = forms.UserProfileInfoForm() return render(request,'accounts/signup.html',{'user_create_form':user_create_form, 'user_profile_form':user_profile_form})
Models.py
from django.db import models from django.contrib import auth class User(auth.models.User,auth.models.PermissionsMixin): def __str__(self): return "@{}".format(self.username) class UserProfileInfo(models.Model): user = models.OneToOneField(User,on_delete=models.CASCADE) Contact_number = models.IntegerField(blank=True) joined_at = models.DateTimeField(auto_now=True) profile_pic = models.ImageField(upload_to='profiles',blank=True) def __str__(self): return self.user.username + ' Profile'
Forms.py
from django.contrib.auth import get_user_model from django import forms from django.contrib.auth.forms import UserCreationForm from . import models class UserCreateForm(UserCreationForm): class Meta(): fields = ('username','email','password1','password2',) model = get_user_model() def __init__(self,*args,**kwargs): super().__init__(*args,**kwargs) self.fields['username'].label = 'Display Name' self.fields['email'].label = "Email Address" class UserProfileInfoForm(forms.ModelForm): class Meta(): model = models.UserProfileInfo fields = ('Contact_number','profile_pic')
问题原因
你自定义了User模型,但未在项目settings.py中配置AUTH_USER_MODEL指定使用该自定义模型。导致get_user_model()返回Django默认的django.contrib.auth.models.User实例,而UserProfileInfo关联的是你自定义的User模型,两者类型不匹配触发错误。
解决方案
- 配置AUTH_USER_MODEL
在项目根目录的settings.py中添加以下配置(若你的app名称不是accounts,请替换为实际名称):
AUTH_USER_MODEL = 'accounts.User'
- 重新执行数据库迁移
- 删除app下
migrations目录中除__init__.py外的所有文件 - 依次执行命令:
- 删除app下
python manage.py makemigrations python manage.py migrate
- 确保模型引用一致性
所有用到User模型的地方,统一使用get_user_model()或直接导入自定义User模型,禁止混用默认与自定义User模型。
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

