Форма Django сохраняет неверную информацию в базу данных

В моей форме, когда я выбираю время, например "8 вечера", оно сохраняется в базе данных как другое время, я проверил отправку формы, и она отправляется как правильное время, но не сохраняется как таковое, есть ли что-то неправильное в коде?


from django.core.exceptions import ValidationError
from django.db import models
from django.contrib.auth.models import User
from django.utils.timezone import now
from django.core.validators import MinValueValidator, MaxValueValidator

class Booking(models.Model):
    name = models.ForeignKey(User, on_delete=models.CASCADE)
    special_occasion = models.CharField(max_length=11, choices=[('None', 'None'), ('anniversary', 'Anniversary'), ('date', 'Date'), ('business', 'Business')])
    meal_day = models.DateField()
    number_of_guests = models.PositiveIntegerField(
        null=True,
        validators=[MinValueValidator(1), MaxValueValidator(6)]
    )
    customer_name = models.CharField(max_length=50)

    TIME_CHOICES = [
        ('13:00', '01:00 PM'),
        ('14:00', '02:00 PM'),
        ('15:00', '03:00 PM'),
        ('16:00', '04:00 PM'),
        ('17:00', '05:00 PM'),
        ('18:00', '06:00 PM'),
        ('19:00', '07:00 PM'),
        ('20:00', '08:00 PM'),
    ]

    meal_time = models.CharField(max_length=5, choices=TIME_CHOICES)

    def clean(self):
        if self.meal_day and self.meal_day < now().date():
            raise ValidationError("Cannot make a booking in the past.")

        existing_bookings = Booking.objects.filter(meal_time=self.meal_time, meal_day=self.meal_day)
        if self.pk:
            existing_bookings = existing_bookings.exclude(pk=self.pk)
        if existing_bookings.exists():
            raise ValidationError("A booking already exists at this time on this day.")

        super().clean()  # Call parent's clean method for remaining validations

    def save(self, *args, **kwargs):
        if not self.pk:
            available_times = [choice[0] for choice in self.TIME_CHOICES]
            booked_times = Booking.objects.filter(meal_day=self.meal_day).values_list('meal_time', flat=True)
            available_times = [time for time in available_times if time not in booked_times]
            if available_times:
                self.meal_time = available_times[0]
            else:
                raise ValidationError("No available time slots for the selected day.")
        super().save(*args, **kwargs)


Эта строка

if available_times:
    self.meal_time = available_times[0]

всегда будет устанавливать meal.time на первое доступное время для новых, несохраненных бронирований, а не на выбранное время. Я не думаю, что вам вообще нужен этот оператор IF, вам нужно только поднять ошибку if not available_times

Вернуться на верх