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
相关产品推荐
相关产品推荐

