Django Admin表单默认验证失效:保留默认验证并添加自定义验证
解决方案
问题出在你的clean方法执行顺序错误——你先执行自定义验证逻辑,再调用父类的clean方法。Django的默认验证(字段级校验、validators规则)是在父类clean中触发的,这就导致空值、非法格式的字段还没被拦截,就进入了自定义逻辑,引发int()转换错误。
只需调整执行顺序,先调用父类的clean完成默认验证,再执行自定义规则,同时可以给自定义逻辑加一层健壮性判断:
def clean(self): # 先执行父类clean,触发默认验证(字段长度、validators校验等) super(TestRange, self).clean() # 自定义验证逻辑(此时字段已通过默认验证,可安全处理) # 双重保障:确保字段不为空再做数字转换 if self.number_start and self.number_end: if int(self.number_end) < int(self.number_start): raise ValidationError({'number_end': _("The end number must be greater than or equal to the start number")}) if self.sda and len(self.number_start) != 10: raise ValidationError({'number_start': _("A SDA number consists of 10 digits")})
关键说明
- 父类
super().clean()会优先执行所有默认验证:包括max_length校验、你定义的valide_phone_number校验,以及字段的非空判断(如果字段设置了blank=False)。只有这些验证全部通过,才会进入你的自定义逻辑,从根源避免空值转int的错误。 - 增加
self.number_start and self.number_end的判断,是为了应对极端场景(比如字段允许为空但默认验证未完全拦截),进一步提升代码健壮性。
这样修改后,Admin的默认验证会正常生效,同时你的自定义规则也会被执行,无需额外定义表单。
内容的提问来源于stack exchange,提问作者Mick
相关产品推荐
相关产品推荐

