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

创建用户后生成register模型记录时遇'function' object has no attribute 'objects'错误

解决Django中'function' object has no attribute 'objects'错误及关联用户创建register记录的问题

错误原因

  1. 命名冲突:视图函数名register和从models导入的模型类register重名,导致代码中register.objects实际指向的是视图函数而非模型类,触发该错误。
  2. 用户ID获取错误:调用User.objects.create_user后未保存用户对象,cd['id']不存在(表单cleaned_data中没有用户id字段)。

修正方案

1. 修正视图函数(views.py)

修改视图函数名避免与模型类重名,同时获取创建后的用户对象用于关联:

from django.shortcuts import render,redirect
from .forms import userregister
from django.contrib.auth.models import User
from testapp.models import register

# 重命名视图函数,避免与模型类冲突
def user_register(request):
    if request.method == 'POST':
        form = userregister(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            # 创建用户并保存到变量
            user = User.objects.create_user(cd['username'], cd['email'], cd['password'])
            # 通过用户对象关联创建register记录
            register.objects.create(address='NONE', phone='NONE', username=user)
            return redirect('testapp:index')
    else:
        form = userregister()

    context = {'form' : form}
    return render(request,'register.html',context)  

2. 规范模型类命名(可选但推荐,models.py)

按照Python类命名规范将模型类改为大写开头,彻底避免命名冲突:

from django.db import models
from django.contrib.auth.models import User

# 类名改为大写开头,符合PEP8规范
class Register(models.Model):
    address = models.CharField(max_length=200)
    phone = models.CharField(max_length=11)
    username = models.OneToOneField(User,on_delete = models.CASCADE)

    def __str__ (self):
        return str(self.username)

若修改模型类名,需同步更新views.py中的导入和调用:

# 导入改为大写的模型类
from testapp.models import Register
# 创建记录时使用
Register.objects.create(address='NONE', phone='NONE', username=user)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 12:10:30