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

