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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:22:11