Временные интервалы 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. С его помощью можно проверить, был ли уже забронирован временной интервал, а затем вывести и отобразить его соответствующим образом.