Django单页多关联模型表单提交后Farmer表数据无法保存问题咨询
问题原因及修复方案
核心问题汇总
- 未关联两个模型的外键关系,就算Farmer保存成功,Post的农户关联字段也为空
- 缺少表单错误提示,无法感知FarmerForm校验失败的具体原因
- PostForm存在字段拼写错误,可能导致表单校验异常
- Farmer模型的手机号字段长度限制过短,大概率是校验失败的直接诱因
分步修复方法
1. 增加表单错误提示(优先做,方便排查问题)
修改前端模板forms.html,在表单开头加入错误输出代码,就能直接看到校验失败的原因:
<form method="POST" action=""> {% csrf_token %} {# 新增错误提示开始 #} {% if form1.errors %} <div style="color:red;margin:10px 40px;"> 农户信息填写错误:{{ form1.errors }} </div> {% endif %} {% if form2.errors %} <div style="color:red;margin:10px 40px;"> 拖拉机信息填写错误:{{ form2.errors }} </div> {% endif %} {# 新增错误提示结束 #} {{ form1.as_p }} {{ form2.as_p }} <button type='submit'> send data </button> </form>
2. 修正外键关联逻辑
你当前的保存逻辑没有把新建的Farmer实例绑定到Post的外键字段,修改views.py的保存逻辑:
if form1.is_valid() and form2.is_valid(): # 先保存农户信息,拿到实例对象 farmer = form1.save() # 暂存拖拉机信息不入库,先绑定外键 post = form2.save(commit=False) post.farmer = farmer # 最终保存拖拉机信息 post.save() return HttpResponseRedirect("/add_post?submitted=True")
3. 修正拼写和字段参数错误
- 修正
forms.py中PostForm的字段拼写错误:把implementaion改为implementation - 修正
models.py中Post模型的tractor_price字段参数:IntegerField不需要max_length,直接改为tractor_price = models.IntegerField() - 若你使用11位中国手机号,把Farmer模型的phone字段长度改大:
phone = models.CharField(max_length=20),修改后执行python manage.py makemigrations和python manage.py migrate更新数据库结构。
内容的提问来源于stack exchange,提问作者lex
相关产品推荐
相关产品推荐

