Django中如何将DateTimeField初始时间格式从HH:MM:SS改为HH:MM?
修改SplitDateTimeWidget的时间显示格式为HH:MM
这个问题其实很常见,咱们直接从修改SplitDateTimeWidget的时间输入格式入手就行,分Admin后台和UpdateView两种场景给你讲清楚:
第一步:自定义SplitDateTimeWidget
首先创建一个继承自SplitDateTimeWidget的自定义组件,替换它默认的时间输入组件(TimeInput)的格式,同时可以设置浏览器时间选择器的步长为60秒,确保只显示分钟选项:
from django.forms.widgets import SplitDateTimeWidget, TimeInput class CustomSplitDateTimeWidget(SplitDateTimeWidget): def __init__(self, attrs=None): # 调用父类初始化方法 super().__init__(attrs) # 替换第二个组件(时间输入)为自定义的TimeInput self.widgets[1] = TimeInput( attrs={'type': 'time', 'step': 60}, # step=60限制只选分钟级别 format='%H:%M' # 指定显示格式为HH:MM )
场景1:Admin后台中使用
有两种方式可以在Admin中应用这个自定义组件:
方式1:通过formfield_overrides全局覆盖
如果希望所有DateTimeField都用这个格式,可以直接在ModelAdmin类中全局指定:
from django.contrib import admin from django.db import models from .models import Event from .widgets import CustomSplitDateTimeWidget # 导入自定义组件 @admin.register(Event) class EventAdmin(admin.ModelAdmin): formfield_overrides = { models.DateTimeField: {'widget': CustomSplitDateTimeWidget}, }
方式2:自定义ModelForm(更灵活)
如果只需要给start字段单独设置,或者需要更多表单定制,推荐用自定义ModelForm:
from django import forms from .models import Event from .widgets import CustomSplitDateTimeWidget class EventAdminForm(forms.ModelForm): class Meta: model = Event fields = '__all__' widgets = { 'start': CustomSplitDateTimeWidget(), # 仅给start字段用自定义组件 } # 在Admin中关联这个表单 @admin.register(Event) class EventAdmin(admin.ModelAdmin): form = EventAdminForm
场景2:UpdateView中使用
在UpdateView里,只需要指定自定义的ModelForm即可:
from django.views.generic.edit import UpdateView from .models import Event from .forms import EventAdminForm # 复用上面的自定义表单,或者单独写一个前端用的表单 class EventUpdateView(UpdateView): model = Event form_class = EventAdminForm success_url = '/events/' # 替换成你的成功跳转路径
补充说明
- 这样修改后,前端的时间输入框会显示为
HH:MM格式,用户输入时也只需要填写分钟,提交后Django会自动把秒数设为00存储到数据库(DateTimeField本身还是会保留秒字段,只是前端不展示)。 - 不建议直接修改Django全局默认设置,会影响所有字段,自定义组件的方式更灵活可控。
内容的提问来源于stack exchange,提问作者Aliquis
相关产品推荐
相关产品推荐

