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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 06:54:23