Django报错AttributeError: type object 'Form' has no attribute 'objects'如何解决
错误原因分析
- 你代码中调用
objects属性的Form是继承自ModelForm的表单类,只有Django ORM的模型类才会自带objects数据库管理器对象,表单类没有该属性,因此直接触发AttributeError。 - 你定义的对应业务模型类是
ModelsForm,所有数据库读写操作都应该基于模型类执行,而非表单类。 - 额外隐错:你原views.py代码未导入
HttpResponse,就算修复上述问题,提交非法数据时也会抛出名称未定义错误。
修复方案
最简修复代码
修改views.py文件,补上缺失导入,替换数据库操作的调用类即可:
from django.shortcuts import render,redirect from django.http import HttpResponse from django.contrib import messages from .forms import * from .models import ModelsForm def main(request): if request.method == "POST": form = Form(request.POST) if form.is_valid(): # 将Form替换为模型类ModelsForm ModelsForm.objects.get_or_create( name=form.cleaned_data['name'], email=form.cleaned_data['email'], phone=form.cleaned_data['phone'] ) messages.success(request, 'Form has been submitted') return redirect('/') else: return HttpResponse("Invalid data") else: form = Form() return render(request, 'app/main.html', {'form': form})
优化建议
如果你不需要额外的去重判断逻辑,ModelForm自带save()方法,可以直接完成数据写入,不需要手动取字段调用get_or_create,代码更简洁:
if form.is_valid(): form.save() messages.success(request, 'Form has been submitted') return redirect('/')
同时建议调整类命名,避免语义混淆:模型类不要带Form后缀(比如改成UserInfo),表单类命名更具象(比如改成UserInfoForm),从命名层面降低误调用概率。
内容的提问来源于stack exchange,提问作者maria_hoffman
相关产品推荐
相关产品推荐

