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

