Django使用MPTT时提交表单无法保存子对象parent父ID如何解决
问题解决方法
你的核心错误出在隐藏输入框的属性配置上,其余还有两处可优化的配置问题,依次修改即可:
1. 修正HTML模板隐藏输入框配置
你把父级ID赋值给了id属性,但表单提交只会提交name对应value属性的内容,导致提交的parent字段一直为空,所以所有新提交的内容都被识别为无父级的根节点。
将原HTML中的隐藏输入框代码修改为:
<input type="hidden" name="parent" value="{{i.sno}}">
如果需要保留id属性也可以同时保留,核心是要给value属性赋值父级sno。
2. 修正表单配置
你的sno是自增主键,由数据库自动生成,不需要通过表单提交,所以从forms.py的字段列表中移除sno:
class TicketForm(forms.ModelForm): class Meta: model = Contact fields = ['message','parent','existing_customer','technical_service']
3. 可选:显式处理父级赋值(规避表单校验异常)
如果修改后仍然出现层级保存错误,可以在视图中手动获取父级对象赋值,避免表单自动转换异常:
def SupportPageView(request): if request.method == "POST": support_form = TicketForm(request.POST or None) if support_form.is_valid(): instance = support_form.save(commit=False) instance.user = request.user instance.name = request.user.first_name instance.email = request.user.email # 手动获取父级对象赋值 parent_sno = request.POST.get('parent') if parent_sno: instance.parent = Contact.objects.get(sno=parent_sno) instance.save() # 其余原有逻辑保持不变
内容的提问来源于stack exchange,提问作者boyenec
相关产品推荐
相关产品推荐

