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

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外的所有文件
    • 依次执行命令:
python manage.py makemigrations
python manage.py migrate
  • 确保模型引用一致性
    所有用到User模型的地方,统一使用get_user_model()或直接导入自定义User模型,禁止混用默认与自定义User模型。

内容的提问来源于stack exchange,提问作者Rahul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 17:00:11