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

Django Admin中带中间表的多对多字段必填校验问题求助

解决Django Admin禁止创建无配料食谱的问题

你的代码问题出在InlineFormSet的验证逻辑上,具体错误和修正方案如下:

问题分析

  1. 错误的方法重写:你重写了clean_ingredients方法,但InlineFormSet的全局验证应该通过重写clean()方法实现,单个字段的clean方法仅针对单个表单的字段验证,无法检查整个表单集的有效条目数量。
  2. cleaned_data使用错误:self.cleaned_data是表单集中所有表单的清洗后数据列表,不是单个表单的字典,直接取self.cleaned_data['ingredients']会引发KeyError。
  3. 未正确触发错误提示:你只是返回错误字符串,没有抛出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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 01:30:47