You need to enable JavaScript to run this app. Django Admin存在必填内联字段时未填写也可保存数据的问题
优惠活动
大模型
产品
解决方案
定价
更多

Django Admin存在必填内联字段时未填写也可保存数据的问题

问题根因

当前配置仅限制了内联的最大数量与删除权限,未强制要求至少提交1条内联数据。extra=0的配置会导致内联表单默认不渲染,管理员未主动点击添加内联时,Django不会触发内联模型的字段校验,自然可以直接保存主模型数据。

解决步骤

修改admin.py中的内联类配置,强制要求至少提交1条有效内联数据,修改后的完整代码如下:

class CourseDetailsInline(admin.StackedInline):
    model = CourseDetails
    extra = 1  # 默认渲染1条内联表单,无需用户手动点击添加
    min_num = 1  # 限制最少提交1条内联数据
    max_num = 1  # 限制最多提交1条内联数据
    validate_min = True  # 开启最少提交数量校验
    can_delete = False
    can_add = False  # 禁止手动增减内联,固定为1条

class CourseDeadlinesInline(admin.StackedInline):
    model = CourseDeadlines
    extra = 1
    min_num = 1
    max_num = 1
    validate_min = True
    can_delete = False
    can_add = False

class CoursesAdmin(admin.ModelAdmin):
    inlines = [CourseDetailsInline, CourseDeadlinesInline]

admin.site.register(Course, CoursesAdmin)

补充说明

如果需要更强的校验兜底,可以重写内联表单集的clean方法,避免特殊场景下的校验绕过:

from django.forms.models import BaseInlineFormSet
from django import forms

class RequiredInlineFormSet(BaseInlineFormSet):
    def clean(self):
        super().clean()
        # 校验是否至少有一条有效数据
        if not any(self.cleaned_data):
            raise forms.ValidationError("必须填写该模块的所有必填信息")

# 在内联类中指定使用自定义表单集即可
class CourseDetailsInline(admin.StackedInline):
    # 其他原有配置不变
    formset = RequiredInlineFormSet

内容的提问来源于stack exchange,提问作者sk01

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 02:36:04