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

Django模板中DateTimeField绑定datetime-local控件不展示数据库值问题

问题原因
  • 核心原因是HTML datetime-local 类型输入框对值的格式要求,和Django DateTimeInput组件默认输出的时间格式不匹配:

    HTML规范要求datetime-local输入框的value必须是 YYYY-MM-DDTHH:mm 格式(无后缀时区信息,日期和时间用大写T分隔),而Django开启时区支持(USE_TZ = True,默认开启)时,DateTimeField存储的是带时区的datetime对象,默认渲染时输出的时间字符串带时区后缀,浏览器无法识别,因此不会填充已有值,只显示默认占位符。

  • 你的表单配置中没有为DateTimeInput组件指定匹配datetime-local要求的输出格式,也没有为字段指定对应格式的输入解析规则,导致双向的格式兼容问题。
修复方案

修改表单类配置,为两个时间字段指定匹配的输出格式和输入解析规则即可:

class AddAppointmentForm(forms.ModelForm):
    # 显式定义时间字段的格式规则
    start_appointment = forms.DateTimeField(
        input_formats=['%Y-%m-%dT%H:%M'],
        widget=forms.DateTimeInput(
            attrs={'class': 'form-control', 'type': 'datetime-local'},
            format='%Y-%m-%dT%H:%M'
        )
    )
    end_appointment = forms.DateTimeField(
        input_formats=['%Y-%m-%dT%H:%M'],
        widget=forms.DateTimeInput(
            attrs={'class': 'form-control', 'type': 'datetime-local'},
            format='%Y-%m-%dT%H:%M'
        )
    )

    class Meta:
        model = Appointment
        fields = ['user', 'name', 'appointment_notes', 'seat', 'start_appointment', 'end_appointment']
        widgets = {
            'user': forms.Select(attrs={'class': 'form-control'}),
            'name': forms.TextInput(attrs={'class': 'form-control'}),
            'appointment_notes': forms.Textarea(attrs={'maxlength': '900', 'class': 'form-control' }),
            'seat': forms.Select(attrs={'class': 'form-control'}),
        }

修改后Django会按照datetime-local要求的格式输出已存储的时间值,同时能正确解析提交的时间字符串,回填和提交功能都会正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:36:00