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

DRF DateField提交表单报错:空值提交提示日期格式需为YYYY-MM-DD

问题原因
  • 你在序列化器中显式定义了evaluation_date = serializers.DateField(),没有指定required=False、allow_null=True、allow_blank=True参数。即使模型层配置了null=True, blank=True,序列化器显式声明的字段会覆盖模型默认映射的属性,默认配置下该字段不接受空值/空字符串,空字符串传入时会在字段默认校验阶段直接抛出格式错误,还没进入你自定义的validate_evaluation_date校验方法。
  • 隐藏的日期input标签没有设置value属性,提交表单时该字段会传入空字符串,你自定义的校验方法中没有做空值判断就直接执行datetime.strptime解析,空字符串不符合日期格式也会触发报错。
修复方案
  1. 修改序列化器的日期字段声明,补充非必填、允许空值的配置:
evaluation_date = serializers.DateField(required=False, allow_null=True, allow_blank=True)
  1. 调整自定义校验逻辑,做空值分支判断,避免无意义的日期解析(同时优化冗余取值逻辑,直接用入参attrs即可,不需要再从request.data重复取值):
def validate_evaluation_date(self, attrs):
    # 获取评估类型
    evaluation_type_id = self.context["request"].data["evaluation_type"]
    evaluation_type = EvaluationType.objects.get(id=evaluation_type_id)
    # 处理空值场景
    if not attrs: # 同时兼容None和空字符串场景
        if evaluation_type.name == "Observation":
            raise serializers.ValidationError("This field is required.")
        # 非Observation类型的空值直接返回None即可
        return None
    # 非空值才执行日期格式解析
    date = datetime.strptime(attrs, "%Y-%m-%d").date()
    return date

可选优化:如果对应表单类型不需要日期字段,可以直接不渲染该input标签,避免提交多余的空值参数,逻辑更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 01:09:04