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

man*_*l_b 8 python django django-forms

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

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

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

问题

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

我试图找到原因,似乎'type': 'date'小部件定制中的部分清除初始值是某种方式;事实上,删除它,初始值日期再次显示,但我当然松开了日期选择器。

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

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

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

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

问题仍然存在

我的代码

模型.py

class TimesheetItem(models.Model):

    date = models.DateField()
    description = models.CharField(max_length=100)
    # many other fields here
Run Code Online (Sandbox Code Playgroud)

表单.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
                      }),
        }
Run Code Online (Sandbox Code Playgroud)

 查看.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")
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助

M。

man*_*l_b 10

我设法让它工作。按照问题的原因,我希望它可以对其他人有用。

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">
Run Code Online (Sandbox Code Playgroud)

由于默认情况下form.DateInput会生成 element <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'
              }),
}
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢,我已经坚持这个一年了! (2认同)
  • 谢谢..你的英雄..我没有注意到这里的问题是在``format=('%Y-%m-%d')``` (2认同)