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

如何在Django Model Form中为日期选择器设置默认值

Django ModelForm日期选择器设置初始值的解决方案

问题说明

你在Django ModelForm中使用自定义DatePickerInput日期选择器时,尝试给Widget传递initial参数设置默认值但未成功,现有代码如下:

自定义Widget代码:

class DatePickerInput(forms.DateInput):
    input_type = 'date'

ModelForm代码:

class PDFClassificationForm(forms.ModelForm):  
    class Meta:  
        model = Documents
        fields = [
                  'id_documenttype',
                  'dateenvoi',
                  'comment'
        ]
        widgets = {
            'dateenvoi' : DatePickerInput(),
        }

错误尝试:

widgets = {
    'dateenvoi' : DatePickerInput(initial= datetime.now().strftime('%d/%m/%y %H:%M:%S')),
}

问题原因

  1. initial不属于Widget的配置参数,无法直接传递给DatePickerInput;
  2. HTML5的date类型输入框要求日期格式为YYYY-MM-DD,你使用的%d/%m/%y %H:%M:%S格式不符合要求,即使设置也无法正确显示。

解决方法

方法一:在表单中显式定义字段并设置初始值

直接在ModelForm中单独定义dateenvoi字段,同时指定Widget和初始值:

from django import forms
from django.utils import timezone
from .models import Documents

class DatePickerInput(forms.DateInput):
    input_type = 'date'
        
class PDFClassificationForm(forms.ModelForm):  
    dateenvoi = forms.DateField(
        widget=DatePickerInput(),
        initial=timezone.now().date()  # 自动转换为YYYY-MM-DD格式
    )
    
    class Meta:  
        model = Documents
        fields = ['id_documenttype', 'dateenvoi', 'comment']

方法二:在表单__init__方法中动态设置初始值

如果不想修改字段定义,可在表单初始化时设置初始值:

from django import forms
from django.utils import timezone
from .models import Documents

class DatePickerInput(forms.DateInput):
    input_type = 'date'
        
class PDFClassificationForm(forms.ModelForm):  
    class Meta:  
        model = Documents
        fields = ['id_documenttype', 'dateenvoi', 'comment']
        widgets = {
            'dateenvoi' : DatePickerInput(),
        }
    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 仅新增数据时设置初始值
        if not self.instance.pk:
            self.fields['dateenvoi'].initial = timezone.now().date()

方法三:通过模型字段设置默认值(可选)

如果希望所有新增Documents实例默认使用当前日期,可在模型字段中配置default:

from django.db import models
from django.utils import timezone

class Documents(models.Model):
    # 其他字段...
    dateenvoi = models.DateField(default=timezone.now)
    # 注意:这里用timezone.now而非timezone.now(),让Django在保存时动态获取当前时间

这种方式下,表单会自动继承模型的默认值,无需额外配置。

注意事项

  • 优先使用django.utils.timezone而非原生datetime,确保和Django时区配置一致;
  • HTML5 date输入框仅支持YYYY-MM-DD格式,直接传递date对象即可,Django会自动完成格式转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:09:25