Django一对一关系表单如何正确获取request.POST?遇未指定模型类报错
问题解决方案
1. 「ModelForm has no model class specified.」报错修复
该报错的直接原因是DetailForm的Meta类属性名书写错误:
- 错误写法:
models = Detail使用了复数形式,Django ModelForm 要求必须用单数的model属性指定关联模型 - 修正后应为
model = Detail
另外存在一处隐藏错误:ComponentForm的fields中包含了description,但Component模型本身没有定义该字段,直接使用会触发字段不存在报错,需要删除该字段,如果需要处理关联的Description数据请单独创建对应的DescriptionForm。
2. 一对一关联表单正确获取request.POST数据的方法
你现有代码里DetailForm在POST请求场景下没有传入request.POST参数,因此完全不会接收提交的数据,需要做如下调整:
核心修正点
- POST请求下实例化
DetailForm时,同时传入request.POST和instance参数 - 表单校验方法
is_valid()必须加括号调用,否则只是判断方法对象是否存在,永远返回True,不会实际执行校验逻辑 - 主表表单保存完成后,需要手动保存关联的Detail表单数据
- 前端模板
edit.html中要保证两个表单的字段都包裹在同一个<form method="post">标签内,且必须包含{% csrf_token %}标签,否则POST请求会被Django安全拦截
修正后完整代码
# form.py 修正后 class ComponentForm(forms.ModelForm): class Meta: model = Component # 移除Component模型不存在的description字段 fields=['partnumber','maker'] class DetailForm(forms.ModelForm): class Meta: # 修正属性名为单数model model = Detail fields=['modelseries'] # 视图函数修正后 @login_required def edit(request,id): # 获取当前编辑的组件与关联的一对一详情数据 comp = Component.objects.get(pk=id) comp_detail = comp.detail if request.method == 'POST': # 两个表单都传入request.POST接收提交数据 c_form = ComponentForm(request.POST, instance=comp) cd_form = DetailForm(request.POST, instance=comp_detail) # is_valid是方法,必须加括号调用才会执行校验逻辑 if c_form.is_valid() and cd_form.is_valid(): c_form.instance.author = request.user c_form.save() # 保存关联的一对一详情数据 cd_form.save() messages.success(request, f'Component has been updated!') return redirect('component-index') else: c_form = ComponentForm(instance=comp) cd_form = DetailForm(instance=comp_detail) context ={ 'c_form':c_form, 'cd_form':cd_form } return render(request, 'component/edit.html',context)
内容的提问来源于stack exchange,提问作者Job dela Cruz
相关产品推荐
相关产品推荐

