Django 1.11
问题:如果一个月内缺少一天,则用户会收到验证错误:"输入有效日期"。
在发生此验证错误之前,我想使用此功能:
def ceil_day(year, month, day):
__weekday, number_of_days_in_month = calendar.monthrange(year, month)
return min(day, number_of_days_in_month)
换句话说,我想替换日期:如果用户输入了不存在的日期,请将其作为该月的最后一天。
你能帮我理解怎么做。
class FrameDateForm(ModelForm):
class Meta:
model = FrameDate
exclude = []
years = range(1800, datetime.datetime.now().year + 1)
widgets = {
'frame': forms.HiddenInput(),
'from_date': forms.SelectDateWidget(years=years),
'through_date': forms.SelectDateWidget(years=years)
}
答案 0 :(得分:0)
您可以通过实施 clean()方法来实现这一目的:
class FrameDateForm(ModelForm):
def clean(self):
super(ModelForm, self).clean()
day = int(self.data.get('from_date_day', 0))
month = int(self.data.get('from_date_month', 0))
year = int(self.data.get('from_date_year', 0))
if day and year and month:
self.cleaned_data['from_date'] = datetime.date(
year, month, ceil_day(year, month, day))
if 'from_date' in self._errors:
del self._errors['from_date']
return self.cleaned_data
总是在表单验证时调用clean()方法。因此我们可以预期ceil_day()始终应用于 from_date 字段。如果出现不存在的日期错误,我们需要在返回之前清除 from_date 字段的错误。