首页 > 解决方案 > Django Forms DateInput 小部件未填充

问题描述

我有一个 django 编辑表单,其中包含来自模型的许多字段,包括一些日期字段,对于合适的格式,我使用了 DateInput 小部件。不幸的是,当我们编辑对象时,所有其他字段都已经填充了现有数据,但日期除外。日期处于其初始状态 (dd/mm/yyyy),由于它们是必需的,因此用户每次想要编辑对象时都必须重新输入日期,即使他们不想更改日期。

有人知道如何在这些日期字段中预填充日期数据吗?

表格.py:

 class DateInput(forms.DateInput):
        input_type = 'date'
        input_formats = ('%d-%m-%Y')
    [...]
 date_sinistre = forms.DateField(widget=DateInput, label='Date sinistre')
 date_effet = forms.DateField(widget=DateInput, label='Date effet')
 date_echeance = forms.DateField(widget=DateInput, label='Date échéance')

编辑对象.html:

    <div class='row border border-primary rounded m-1 border-3'>
            <div class='col-md-4 p-0 pl-2 pr-2 justify-content-center align-self-center'>
                <strong>DATE DE SINISTRE:</strong>
            </div>
            <div class='col-md-8 p-0 pl-2 pr-0 justify-content-center align-self-center'>
                {{ dossierForm.date_sinistre|as_crispy_field }}
            </div>
        </div>

        <div class='row border border-primary rounded m-1 border-3'>
            <div class='col-md-4 p-0 pl-2 pr-2 justify-content-center align-self-center'>
                <strong>DATE EFFET:</strong>
            </div>
            <div class='col-md-8 p-0 pl-2 pr-0 justify-content-center align-self-center'>
                {{ dossierForm.date_effet|as_crispy_field }}
            </div>
        </div>

        <div class='row border border-primary rounded m-1 border-3'>
            <div class='col-md-4 p-0 pl-2 pr-2 justify-content-center align-self-center'>
                <strong>DATE ÉCHÉANCE:</strong>
            </div>
            <div class='col-md-8 p-0 pl-2 pr-0 justify-content-center align-self-center'>
                {{ dossierForm.date_echeance|as_crispy_field }}
            </div>
    </div>

PS:虽然我将格式指定为 dd-mm-yy,但小部件仍将日期显示为 MM-DD-YYYY。

截屏:在此处输入图像描述

标签: djangodjango-forms

解决方案


DateInput根据和DateTimeBaseInput[GitHub]的源码,需要给构造函数指定参数[Django-doc]format=…

class DateTimeBaseInput(TextInput):
    format_key = ''
    supports_microseconds = False

    def __init__(self, attrs=None, format=None):
        super().__init__(attrs)
        self.format = format or None

    def format_value(self, value):
        return formats.localize_input(value, self.format or formats.get_format(self.format_key)[0])


class DateInput(DateTimeBaseInput):
    format_key = 'DATE_INPUT_FORMATS'
    template_name = 'django/forms/widgets/date.html'

因此,您可以通过以下方式实现:

    # …
    date_sinistre = forms.DateField(widget=forms.DateInput(format='%d-%m-%Y'), label='Date sinistre')
    date_effet = forms.DateField(widget=forms.DateInput(format='%d-%m-%Y'), label='Date effet')
    date_echeance = forms.DateField(widget=forms.DateInput(format='%d-%m-%Y'), label='Date échéance')

此外,您可能应该更改DATE_INPUT_FORMAT设置 [Django-doc]并将您的'%d-%m-%Y'格式添加为可接受的格式之一。


推荐阅读