Временные интервалы Django не отображаются в форме

Я пытаюсь создать систему бронирования на Django, где я пытаюсь реализовать логику, что если временной интервал забронирован на определенный день, то этот интервал не должен быть кликабельным (отключенным). А рядом с таймслотом должна быть надпись (забронировано).

Это моя реализация. Но моя логика не работает. Не отображаются временные интервалы. Может ли кто-нибудь помочь мне указать на проблему? Спасибо!

Мой models.py:

class Timeslot(models.Model):
    start_time = models.TimeField()
    end_time = models.TimeField()
    slot_text = models.CharField(max_length=100)

    def __str__(self):
        return self.slot_text

class Appointment(models.Model):
    name = models.CharField(max_length=100)
    phone = models.CharField(max_length=20)
    email = models.EmailField()
    date = models.DateField()
    timeslot = models.ForeignKey(Timeslot, on_delete=models.CASCADE)
    booked_on = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.name} - {self.date} - {self.timeslot.slot_text}"

Мой views.py:

def check_availability(date):
    timeslots = Timeslot.objects.all()
    booked_timeslots = Appointment.objects.filter(date=date).values_list('timeslot', flat=True)
    available_timeslots = [(timeslot, timeslot.id not in booked_timeslots) for timeslot in timeslots]
    return available_timeslots

def book_appointment(request):
    available_timeslots = []
    form_data = {}
    if request.method == 'POST':
        name = request.POST.get('name')
        phone = request.POST.get('phone')
        email = request.POST.get('email')
        date = request.POST.get('date')
        timeslot_id = request.POST.get('timeslot')

        form_data = {
            'name': name,
            'phone': phone,
            'email': email,
            'date': date,
            'timeslot': timeslot_id,
        }

        if 'check_timeslots' in request.POST:
            if date:
                available_timeslots = check_availability(date)
            else:
                messages.error(request, 'Please select a date to check available timeslots.')
        elif 'book_appointment' in request.POST:
            if not all([name, phone, email, date, timeslot_id]):
                messages.error(request, 'Please fill out all fields.')
            else:
                timeslot = Timeslot.objects.get(id=timeslot_id)
                existing_appointment = Appointment.objects.filter(date=date, timeslot=timeslot).exists()
                if existing_appointment:
                    messages.error(request, 'The selected timeslot is already booked.')
                    available_timeslots = check_availability(date)
                else:
                    appointment = Appointment.objects.create(
                        name=name,
                        phone=phone,
                        email=email,
                        date=date,
                        timeslot=timeslot
                    )

                    send_mail(
                        subject="Booking Confirmation",
                        message=f"Dear {name},\n\nYour appointment is confirmed for {date} at {timeslot.slot_text}.\n\nThank you!",
                        from_email='your-email@example.com',
                        recipient_list=[email, 'your-email@example.com'],
                        fail_silently=False,
                    )

                    messages.success(request, 'Your appointment has been booked successfully!')
                    return redirect('appointment')

    return render(request, 'appointment/appointment.html', {
        'available_timeslots': available_timeslots,
        'form_data': form_data,
    })

Моя встреча.html:

Если вы добавите в модель булево поле 'is_booked', вы сможете работать с условным оператором if. С его помощью можно проверить, был ли уже забронирован временной интервал, а затем вывести и отобразить его соответствующим образом.

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