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

Posted

技术标签:

【中文标题】更新中带有小部件的 Django Form DateInput:丢失初始值【英文标题】:Django Form DateInput with widget in update: loosing the initial value 【发布时间】:2020-07-19 10:45:17 【问题描述】:

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

由于 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")

感谢您的帮助

M.

【问题讨论】:

【参考方案1】:

我设法让它工作。跟踪问题的原因,我希望它对其他人有用。

HTML &lt;input type='date'&gt; 元素需要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 会生成元素 &lt;input type='text'&gt;,因此它需要本地格式的日期:假设为 '31/03/2020'。

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

最后正确的指令是:

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

【讨论】:

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

以上是关于更新中带有小部件的 Django Form DateInput:丢失初始值的主要内容,如果未能解决你的问题,请参考以下文章

Django 中带有 Celery 的 AWS SQS

从 Django 的 TextArea 小部件中删除标签

如何对 Django Select 小部件中的选择进行分组?

Django:如何覆盖 form.save()?

Django 表单和引导程序 - 添加小部件有效但不完全

Django Form 将 ChoiceField 选项设置为 Form 被调用