Django 选择DateWidget:在日期错误的情况下替换日期

Django 选择DateWidget:在日期错误的情况下替换日期,django,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) 换句话说,我想替换日期:如果用户输入一个不存在的日期,就让它成为

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)
换句话说,我想替换日期:如果用户输入一个不存在的日期,就让它成为当月的最后一天

你能帮我理解怎么做吗


您可以通过实现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字段的错误

我添加了clean方法。什么也没变。我在其中放置了一个断点,调试器不会停止。我认为,甚至在验证之前,他们就试图利用手头的信息建立一个日期。当然,出现了异常。这意味着调试器没有到达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