SelectDateWidget и неполное заполнение даты (например, выбран только месяц) - Python

Формулировка задачи:

Django 1.11Есть такой SelectDateWidget. Прикольный, конечно. Но я что-то не могу с ним справиться. Если в модели у поля поставить blank=True, то появляются "---" вместо месяца, дня и года, соответственно. Вот дока: https://docs.djangoproject.com/en/1....et.empty_label Посмотрите, пожалуйста, на код: я поставил две точки останова. И посиотрите на картинку. При этом если дата заполнена полностью или не заполнена вовсе, то я останавливаюсь на обеих точках останова. А вот если я выбираю только месяц, то отладчик не останавливается ни на точке останова № 1, ни на точке № 2. А взрывается уже в CreateView. Я понять ничего не могу: это же форма, она должна уметь делать валидацию. Ничего себе - во вьюху пропускаю ошибку и поймать не могу.Выручайте, пожалуйста: как сделать валидацию формы, чтобы ловила эту ошибку?
class FrameDate(models.Model):
    through_date = models.DateField(null=True,
                                    blank=True,
                                    verbose_name=_("through"))
    ...
 
class FrameDateForm(ModelForm):
 
    def clean_through_date(self):
        pass # Breakpoint
 
    def clean(self):
        pass # Breakpoint 2
 
    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)
            }

Код к задаче: «SelectDateWidget и неполное заполнение даты (например, выбран только месяц) - Python»

textual
Traceback (most recent call last):
  File "/home/michael/PycharmProjects/venv/photoarchive/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/home/michael/PycharmProjects/venv/photoarchive/lib/python3.6/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/michael/PycharmProjects/venv/photoarchive/lib/python3.6/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/michael/PycharmProjects/venv/photoarchive/lib/python3.6/site-packages/django/views/generic/base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/michael/PycharmProjects/venv/photoarchive/lib/python3.6/site-packages/django/contrib/auth/mixins.py", line 56, in dispatch
    return super(LoginRequiredMixin, self).dispatch(request, *args, **kwargs)
  File "/home/michael/PycharmProjects/photoarchive_2/photoarchive/general/view_mixins.py", line 61, in dispatch
    **kwargs);
  File "/home/michael/PycharmProjects/venv/photoarchive/lib/python3.6/site-packages/django/views/generic/base.py", line 88, in dispatch
    return handler(request, *args, **kwargs)
  File "/home/michael/PycharmProjects/venv/photoarchive/lib/python3.6/site-packages/django/views/generic/edit.py", line 217, in post
    return super(BaseCreateView, self).post(request, *args, **kwargs)
  File "/home/michael/PycharmProjects/venv/photoarchive/lib/python3.6/site-packages/django/views/generic/edit.py", line 182, in post
    if form.is_valid():
  File "/home/michael/PycharmProjects/photoarchive_2/photoarchive/framedates/forms.py", line 79, in is_valid
    self.handle_from_through_date("through")
  File "/home/michael/PycharmProjects/photoarchive_2/photoarchive/framedates/forms.py", line 55, in handle_from_through_date
    valid_day = self.ceil_day(user_day, user_month, user_year)
  File "/home/michael/PycharmProjects/photoarchive_2/photoarchive/framedates/forms.py", line 39, in ceil_day
    number_of_days_in_month = get_number_of_days_in_month(year_int, month_int)
  File "/home/michael/PycharmProjects/photoarchive_2/photoarchive/general/utils.py", line 51, in get_number_of_days_in_month
    __, number_of_days_in_month = calendar.monthrange(year_int, month_int)
  File "/usr/lib/python3.6/calendar.py", line 124, in monthrange
    day1 = weekday(year, month, 1)
  File "/usr/lib/python3.6/calendar.py", line 116, in weekday
    return datetime.date(year, month, day).weekday()
ValueError: year 0 is out of range
[17/Jun/2017 09:30:24] "POST /frames/13/framedates/create/ HTTP/1.1" 500 21115

10   голосов, оценка 4.000 из 5


СОХРАНИТЬ ССЫЛКУ