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

