Django Admin中带中间表的多对多字段必填校验问题求助
解决Django Admin禁止创建无配料食谱的问题
你的代码问题出在InlineFormSet的验证逻辑上,具体错误和修正方案如下:
问题分析
- 错误的方法重写:你重写了
clean_ingredients方法,但InlineFormSet的全局验证应该通过重写clean()方法实现,单个字段的clean方法仅针对单个表单的字段验证,无法检查整个表单集的有效条目数量。 - cleaned_data使用错误:
self.cleaned_data是表单集中所有表单的清洗后数据列表,不是单个表单的字典,直接取self.cleaned_data['ingredients']会引发KeyError。 - 未正确触发错误提示:你只是返回错误字符串,没有抛出
ValidationError,Django Admin无法识别并显示这类错误。
修正后的代码
修改admin.py中的IngredientsAmountInlineFormset类:
from django.forms import BaseInlineFormSet from django.core.exceptions import ValidationError class IngredientsAmountInlineFormset(BaseInlineFormSet): def clean(self): super().clean() # 过滤掉被标记为删除的表单和无效空表单 valid_forms = [ form for form in self.forms if not form.cleaned_data.get('DELETE', False) and form.is_valid() ] # 检查有效配料条目数量 if len(valid_forms) == 0: raise ValidationError("Укажите хотя бы один ингредиент в рецепте")
其余代码保持不变即可。
关键说明
- 调用
super().clean()确保先执行父类的清洗逻辑,完成单个表单的字段验证。 - 过滤删除标记的表单:用户可能添加配料后又勾选删除,这类条目不应计入有效数量。
- 抛出
ValidationError:这是Django识别验证错误的标准方式,错误信息会在Admin界面顶部展示。
内容的提问来源于stack exchange,提问作者Zuma
相关产品推荐
相关产品推荐

