Django使用inlineformset_factory更新记录重复创建且报id必填错误如何解决
问题原因排查
核心问题
你的异常完全是**前端模板未渲染inlineformset自带的隐藏主键字段(id)**导致的:
- Django的inlineformset渲染时,每个关联子表单会自动生成一个隐藏的
id字段,用来标记当前表单对应的数据库已有记录主键 - 提交时如果没有这个字段,Django无法识别你要更新的是哪条已有记录,只会把所有提交的子表单都判定为新增条目,所以就会重复生成相同内容的新记录
- 当你修改已有记录时,Django校验时找不到对应的id参数,就会返回
[{'id': ['This field is required.']}]的报错
次要检查项
你的employmentHistoryForm手动给每个字段加了name属性,要注意不要和Django formset自动生成的name格式冲突,Django formset的子表单字段name格式默认是form-0-JobTitle、form-1-start_date这种,你手动覆盖name的话会导致字段值无法正常匹配,也可能引发提交异常。
修复方案
- 前端模板补全formset的隐藏字段
在渲染工作经历子表单的循环中,首先渲染每个子表单的隐藏字段,示例模板代码如下:
<form method="post" enctype="multipart/form-data"> {% csrf_token %} <!-- 渲染个人信息表单 --> {{ form1.as_p }} <!-- 渲染formset的管理表单(必填,Django用来识别子表单数量) --> {{ formset.management_form }} <!-- 循环渲染每个工作经历子表单 --> {% for form in formset %} <!-- 首先渲染子表单的所有隐藏字段,包括id字段 --> {% for hidden in form.hidden_fields %} {{ hidden }} {% endfor %} <!-- 再渲染你自定义的可见字段 --> {% for field in form.visible_fields %} <div class="form-group"> {{ field.label_tag }} {{ field }} {% if field.errors %} {% for error in field.errors %} <span class="text-danger">{{ error }}</span> {% endfor %} {% endif %} </div> {% endfor %} {% endfor %} <button type="submit">保存简历</button> </form>
- 移除表单类中自定义的name属性
把employmentHistoryForm里每个字段widget的name参数删掉,避免覆盖Django自动生成的符合formset规则的name值,比如:
# 修改前 JobTitle = forms.CharField(label="", required=False, widget=forms.TextInput( attrs={'type': 'text', 'class': 'form-control jobTitle', 'name': 'jobTitle'})) # 修改后 JobTitle = forms.CharField(label="", required=False, widget=forms.TextInput( attrs={'type': 'text', 'class': 'form-control jobTitle'}))
所有字段都按这个规则调整即可。
- 视图代码优化(可选)
建议把form和formset的校验逻辑改成双校验通过才保存,避免出现个人信息保存成功但工作经历保存失败的不一致问题:
if request.method == 'POST': form1 = personalDetailsForm(request.POST, request.FILES, instance=user) formset = workExpFormSet(request.POST, instance=user) # 两个表单都校验通过才保存 if form1.is_valid() and formset.is_valid(): form1.save() formset.save() else: print(formset.errors) print(form1.errors)
内容的提问来源于stack exchange,提问作者Karl Erol Pasion
相关产品推荐
相关产品推荐

