SelectDateWidget:在错误的一天中替换日

时间:2017-06-11 08:53:00

标签: django

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)

换句话说,我想替换日期:如果用户输入了不存在的日期,请将其作为该月的最后一天。

你能帮我理解怎么做。

enter image description here

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)
            }

1 个答案:

答案 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 字段的错误。