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)
问题仍然存在
class TimesheetItem(models.Model):
date = models.DateField()
description = models.CharField(max_length=100)
# many other fields here
Run Code Online (Sandbox Code Playgroud)
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)
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)
| 归档时间: |
|
| 查看次数: |
2047 次 |
| 最近记录: |