Как решить проблему с чистой функцией в Django - PullRequest
1 голос
/ 07 июня 2019

Я создаю веб-сайт бронирования, где клиент может записаться на встречу в день по своему выбору, а время встречи выбирается из доступных слотов с помощью раскрывающегося меню.Проблема в том, что если временной интервал уже был кем-то забронирован, он не должен быть доступен и клиенту должно быть показано сообщение об ошибке.

Я написал чистую функцию для выполнения проверки.Выдает следующее сообщение об ошибке: -

No booking on  2019-06-08
Internal Server Error: /
Traceback (most recent call last):
  File "/home/gireesh/PycharmProjects/astrobookinenv/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/gireesh/PycharmProjects/astrobookinenv/lib/python3.6/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/gireesh/PycharmProjects/astrobookinenv/lib/python3.6/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/gireesh/PycharmProjects/astrobookinenv/lib/python3.6/site-packages/django/views/generic/base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/gireesh/PycharmProjects/astrobookinenv/lib/python3.6/site-packages/django/views/generic/base.py", line 97, in dispatch
    return handler(request, *args, **kwargs)
  File "/home/gireesh/PycharmProjects/astrobookinenv/lib/python3.6/site-packages/django/views/generic/edit.py", line 172, in post
    return super().post(request, *args, **kwargs)
  File "/home/gireesh/PycharmProjects/astrobookinenv/lib/python3.6/site-packages/django/views/generic/edit.py", line 141, in post
    if form.is_valid():
  File "/home/gireesh/PycharmProjects/astrobookinenv/lib/python3.6/site-packages/django/forms/forms.py", line 185, in is_valid
    return self.is_bound and not self.errors
  File "/home/gireesh/PycharmProjects/astrobookinenv/lib/python3.6/site-packages/django/forms/forms.py", line 180, in errors
    self.full_clean()
  File "/home/gireesh/PycharmProjects/astrobookinenv/lib/python3.6/site-packages/django/forms/forms.py", line 383, in full_clean
    self._post_clean()
  File "/home/gireesh/PycharmProjects/astrobookinenv/lib/python3.6/site-packages/django/forms/models.py", line 403, in _post_clean
    self.instance.full_clean(exclude=exclude, validate_unique=False)
  File "/home/gireesh/PycharmProjects/astrobookinenv/lib/python3.6/site-packages/django/db/models/base.py", line 1181, in full_clean
    self.clean_fields(exclude=exclude)
  File "/home/gireesh/PycharmProjects/astrobookinenv/lib/python3.6/site-packages/django/db/models/base.py", line 1223, in clean_fields
    setattr(self, f.attname, f.clean(raw_value, self))
  File "/home/gireesh/PycharmProjects/astrobookinenv/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 629, in clean
    value = self.to_python(value)
  File "/home/gireesh/PycharmProjects/astrobookinenv/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 2187, in to_python
    parsed = parse_time(value)
  File "/home/gireesh/PycharmProjects/astrobookinenv/lib/python3.6/site-packages/django/utils/dateparse.py", line 89, in parse_time
    match = time_re.match(value)
TypeError: expected string or bytes-like object

Код функции очистки: -

    def clean_booking_time(self):
        booked_time = self.cleaned_data['booking_time']
        booked_date = self.cleaned_data['booking_date']
        # count = Booking.objects.filter(booking_date=booked_date).filter(booking_time=booked_time).count()
        count_date = Booking.objects.filter(booking_date=booked_date).count()
        if count_date == 0:
            print("No booking on ",booked_date)
            return self.cleaned_data
        else:
            count_time = Booking.objects.filter(booking_date=booked_date).filter(booking_time=booked_time).count()
            if count_time != 0:
                error_message = "%s is not available !" % booked_time
                raise ValidationError(error_message)
            else:
                return self.cleaned_data

Если я назначу встречу, удалив очистку, она успешно сохранится, а затемесли я добавлю код обратно и попытаюсь забронировать в то же время, код работает нормально и выдает ошибку.Похоже, не работает, когда на дату нет бронирования.Возможно, проблема в ORM, который я написал.

Ответы [ 2 ]

2 голосов
/ 07 июня 2019

Вы возвращаете dict cleaned_data в чистом методе, специфичном для поля.Предполагается, что вы должны вернуть только значение для этого поля.

Однако, похоже, что на самом деле это должен быть общий метод clean (), так как он ссылается на несколько полей.Этот метод равен и предназначен для возврата всего слова.

Просто переименуйте метод в clean.

1 голос
/ 07 июня 2019

Вы должны вернуть данные booking_time для функции clean_booking_time:

def clean_booking_time(self):
    booked_time = self.cleaned_data['booking_time']
    booked_date = self.cleaned_data['booking_date']
    booking_exists = Booking.objects.filter(
        booking_date=booked_date,
        booking_time=booked_time
    ).exists()
    if booking_exists:
        error_message = "%s is not available !" % booked_time
        raise ValidationError(error_message)
    return <b>booked_time</b>

Более того, немного странно, что вы очищаете здесь специфическое поле , поскольку ваша очистка ограничивает связь между двумя полями.

При этом, возможно, вы захотите рассмотреть DateTimeField [Django-doc] , который содержит время и дату.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...