创建用户后生成register模型记录时遇'function' object has no attribute 'objects'错误
解决Django中'function' object has no attribute 'objects'错误及关联用户创建register记录的问题
错误原因
- 命名冲突:视图函数名
register和从models导入的模型类register重名,导致代码中register.objects实际指向的是视图函数而非模型类,触发该错误。 - 用户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
相关产品推荐
相关产品推荐

