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 и неполное заполнение даты (например, выбран только месяц)»
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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д