You need to enable JavaScript to run this app. Django更新模型时报「Enter a valid date.」错误,重启服务仅生效一次
优惠活动
大模型
产品
解决方案
定价
更多

Django更新模型时报「Enter a valid date.」错误,重启服务仅生效一次

问题原因

你项目内所有DateField类型字段均使用了django.utils.timezone.now作为默认值,该函数返回的是带时区信息的datetime对象,和DateField预期接收的date类型不匹配:

  • 服务重启后第一次操作正常,是因为Django首次加载字段默认值时会自动做隐式类型转换,临时将datetime转为符合要求的date类型
  • 后续操作时Django会缓存字段的默认值类型,渲染编辑表单时会错误输出带时间部分的日期字符串,提交时DateField校验器无法识别该格式,就会抛出「Enter a valid date.」错误

解决步骤

1. 修改所有DateField的默认值定义

将原来的默认值替换为返回date类型的可调用对象,推荐用时区安全的自定义函数:

from django.utils import timezone
# 自定义返回当前日期的函数
def get_today_date():
    return timezone.now().date()

# 替换原字段定义的default参数
delivery_deadline = models.DateField(default=get_today_date)

如果你的项目不需要时区适配,也可以直接使用:

import datetime
delivery_deadline = models.DateField(default=datetime.date.today)

⚠️ 注意不要给函数加括号,否则默认值会被固定为代码编译时的日期,不会动态更新。

2. 生成并执行数据库迁移

修改完模型字段后执行以下命令更新数据库配置:

python manage.py makemigrations
python manage.py migrate

3. (可选)配置表单日期输入格式

如果修改后仍有校验问题,可以自定义ModelForm指定兼容的日期输入格式,在orders/forms.py中添加:

from django import forms
from .models import Orders

class OrderUpdateForm(forms.ModelForm):
    delivery_deadline = forms.DateField(
        # 这里根据你前端实际使用的日期格式调整即可
        input_formats=['%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y']
    )
    class Meta:
        model = Orders
        fields = '__all__'

然后修改更新视图的配置,使用自定义表单:

class OrderUpdateView(LoginRequiredMixin, UpdateView):
    model = Orders
    template_name = 'orders/order_update_form.html'
    form_class = OrderUpdateForm

项目内其他模型的DateField字段全部按上述方案调整后,即可解决所有模型的编辑报错问题。


内容的提问来源于stack exchange,提问作者Md Moksedul Alam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 01:15:03