如何解决djang的清洁功能问题

2024-05-16 23:01:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在建立一个预订网站,在那里,客户可以在他/她选择的一天预订,并通过下拉菜单从可用的时段中选择预约时间。问题是,如果某个时间段已经被某个人预订,则该时间段不可用,并且应该向客户显示一条错误消息。你知道吗

我已经编写了一个干净的函数来执行检查。其给出的误差如下:

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

如果我通过删除clean来预订约会,它将成功保存,然后如果我添加代码并尝试在同一时间预订,代码工作正常并抛出错误。只有在日期没有预约的情况下,它才似乎不起作用。问题可能出在我写的ORM上。你知道吗


Tags: djangoinpyselfcleanhometimelib
2条回答

您正在以字段特定的clean方法返回已清理的\u数据dict。您应该只返回该字段的值。你知道吗

不过,这实际上应该是整体clean()方法,因为它引用多个字段。这个方法是用来返回整个dict的

只需将方法重命名为clean。你知道吗

应该为clean_booking_time函数返回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 booked_time

此外,在这里清理一个特定的字段有点奇怪,因为清理限制了两个字段之间的关系。你知道吗

也就是说,您可能需要考虑一个同时包含时间和日期的^{} [Django-doc]。你知道吗

相关问题 更多 >