带有更新的小部件的Django表单DateInput:丢失初始值

问题描述 投票:0回答:1

我需要使用默认HTML日期选择器的ModelForm中的DateInput字段(我没有使用第三方库)。

由于DateInput默认使用<input type = "text">呈现,因此缺少日期选择器(<input type = "date">免费提供)

我已经找到了一些示例,解释了如何通过处理widget参数来更改输入类型(在到目前为止我完成的代码下面)

问题

我使日期选择器正常工作,但是在将初始日期值传递给表单时(请参见视图部分),日期选择器处于“更新模式”,该日期在HTML中保持为空。

我试图找到原因,似乎小部件定制中的'type': 'date'部分正在清除初始值;实际上,将其删除后,会再次显示初始值日期,但是我当然松开了日期选择器。

在视图中,日期以有效值传递

我还发现了另一个类似的未答复的question,其中该字段被声明为

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

date_effet = forms.DateField(widget=forms.DateInput(format='%d-%m-%Y'), label='Date effet')

问题仍然存在

我的代码

model.py

class TimesheetItem(models.Model):

    date = models.DateField()
    description = models.CharField(max_length=100)
    # many other fields here

form.py

class TimesheetItemForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # init is used for other fields initialization and crispy forms


    class Meta:
        model = TimesheetItem
        fields = ['date', 'description']

        widgets = {
            'date': forms.DateInput(
                format=('%d/%m/%Y'),
                attrs={'class': 'form-control', 
                       'placeholder': 'Select a date',
                       'type': 'date'  # <--- IF I REMOVE THIS LINE, THE INITIAL VALUE IS DISPLAYED
                      }),
        }

́view.py

def edit(request, uuid):
    try:
        timesheet_entry_item = TimesheetItem.objects.get(uuid=uuid)

        if request.method == 'POST':
            form = TimesheetItemForm(
                data=request.POST,
                instance=timesheet_entry_item
            )

            if form.is_valid():
                pass # save the form
        else:
            form = TimesheetItemForm(initial={
                'date': timesheet_entry_item.date,  # <--- the date here has a valid value
                'description': timesheet_entry_item.description
            })
        return render(request, 'template.html', {'form': form})
    except ObjectDoesNotExist:
        raise Http404("error")

感谢您的帮助

python django django-forms
1个回答
0
投票
HTML <input type='date'>元素需要采用YYYY-mm-dd格式的日期;实际上,工作HTML的示例必须是这样的:

<input type="date" name="date" value="2020-03-31" class="form-control dateinput form-control" placeholder="Select a date" required="" id="id_date">

由于默认情况下form.DateInput会产生元素<input type='text'>,因此它期望使用本地格式的日期:比如说'31 / 03/2020'。

强制'type': 'date'和本地格式format=('%d/%m/%Y')或根本不传递格式,因为<input type='date'>想要format=('%Y-%m-%d'),它会忽略传递的值

最后正确的指示是:

widgets = { 'date': forms.DateInput( format=('%Y-%m-%d'), attrs={'class': 'form-control', 'placeholder': 'Select a date', 'type': 'date' }), }

© www.soinside.com 2019 - 2024. All rights reserved.