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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:24:03