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

如何为Django DateTimeField设置12:00 PM默认时间并适配datetime-local输入

Django DateTimeField 配合 datetime-local 组件设置默认12:00的解决方案

问题根源

你之前的方案未生效主要有3个原因:

  • 使用原生datetime.now()生成的是无时区信息的 naive 时间,和Django默认开启的时区支持环境不兼容
  • DateTimeInput组件未指定符合datetime-local要求的输出格式,生成的时间字符串格式不匹配,组件无法识别默认值
  • input_formats配置存在语法错误,且包含不必要的时区格式规则

修正步骤

1. 修正模型层默认时间函数

替换原生datetime为Django自带的时区工具,保证时间时区一致性:

from django.utils import timezone
# 如需使用本地时区,额外引入localtime
# from django.utils.timezone import localtime

def set_default_time_checkout():
    now = timezone.now()
    # 若需设置为本地时区的12点,取消下一行注释
    # now = localtime(now)
    new_time = now.replace(hour=12, minute=0, second=0, microsecond=0)
    return new_time

class Booking(models.Model):
    check_in = models.DateTimeField(default=timezone.now)
    check_out = models.DateTimeField(default=set_default_time_checkout, blank=True, null=True)

2. 修正表单配置

给DateTimeInput组件指定匹配datetime-local的格式,修正输入格式规则:

class BookingForm(forms.ModelForm):
    check_in = forms.DateTimeField(
        required=True,
        input_formats=['%Y-%m-%dT%H:%M'],
        widget=forms.DateTimeInput(
            attrs={'type':'datetime-local'},
            format='%Y-%m-%dT%H:%M'
        )
    )
    check_out = forms.DateTimeField(
        required=False,
        input_formats=['%Y-%m-%dT%H:%M'],
        widget=forms.DateTimeInput(
            attrs={'type':'datetime-local'},
            format='%Y-%m-%dT%H:%M'
        )
    )

    class Meta:
        model = Booking
        fields = ['check_in', 'check_out']

注意事项

  • 只有新建表单(实例化表单时不传instance参数)时才会触发默认值,编辑已有数据时会优先读取数据库中存储的字段值
  • 无需在Form字段中重复声明initial参数,表单会自动读取Model层配置的default值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:12:00