Django Admin中如何为Formset内的ticket_id字段添加add_error?
解决Django Admin内联表单集字段添加错误的问题
你遇到的报错核心原因很明确:你在**主表单(TimesheetForm)**上调用了add_error,但ticket_id字段并不属于这个主表单——它是内联Action模型对应的表单里的字段。要给这个字段添加错误,你需要找到对应的内联表单实例,而不是直接操作主表单。
解决方案:遍历表单集的表单和实例
修改你的save_formset方法,同时遍历formset.forms(内联表单的集合)和对应的实例,这样就能精准地把错误绑定到包含ticket_id的那个内联表单上:
def save_formset(self, request, form, formset, change): instances = formset.save(commit=False) # 同时遍历内联表单和对应的Action实例 for inline_form, instance in zip(formset.forms, instances): # 注意:这里建议把ticket_id传入API请求,否则API无法定位到具体工单 url = f'https://xxx.xxxxxx.com/api.php?ticket_id={instance.ticket_id}' contents = requests.get(url) if contents.status_code == 200 and contents.json()['result'] == 'success': instance.ticket_title = contents.json()['subject'] instance.save() else: # 给当前内联表单的ticket_id字段添加错误提示 inline_form.add_error('ticket_id', 'Ticket ID Not Found') formset.save_m2m()
关键说明:
formset.forms包含了所有内联的ActionForm实例,每个表单对应instances里的一个Action对象,用zip配对后就能一一对应。- 调用
inline_form.add_error('ticket_id', ...)会把错误信息直接显示在对应的内联表单的ticket_id字段下方,符合用户预期的错误提示位置。 - 额外提醒:原代码里的API请求没有传入
ticket_id参数,这应该是个遗漏,不然API无法知道要查询哪个工单,所以我在示例里补上了这个参数,你可以根据实际API要求调整。
内容的提问来源于stack exchange,提问作者Arash Mousavi
相关产品推荐
相关产品推荐

