Форма бронирования на django, которая заполняет выпадающее меню свободным временем
Я могу отобразить доступное время в выпадающем меню, но когда я отправляю форму, она не сохраняется в базе данных. У меня есть две формы, в первой пользователь выбирает дату, а во второй доступные даты должны отображаться в выпадающем меню.
models.py
Slots = (
('9.00 - 10.00', '9.00 - 10.00'),
('10.00 - 11.00', '10.00 - 11.00'),
('11.00 - 12.00', '11.00 - 12.00'),
('12.00 - 13.00', '12.00 - 13.00'),
('13.00 - 14.00', '13.00 - 14.00'),
('14.00 - 15.00', '14.00 - 15.00'),
('15.00 - 16.00', '15.00 - 16.00'),
('16.00 - 17.00', '16.00 - 17.00'),
('17.00 - 18.00', '17.00 - 18.00'),
)
class Booking(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)
slot = models.CharField(max_length=15, choices=Slots)
booking_date = models.CharField(max_length=15, default='foo')
def __str__(self):
return f'{self.user} has booked a PT at {self.slot} on {self.booking_date}'
views.py
def DateView(request):
form = DateForm(request.POST or None)
if form.is_valid():
request.session["dateSelected"] = str(
form.cleaned_data["booking_date"])
#sends user to next form
return redirect('create')
context = {
'form': form
}
return render(request, "bookingapp/date_form.html", context)
def BookingView(request):
instance = Booking(booking_date=request.session.get(
'dateSelected'), user=request.user)
form = BookingForm(request.POST or None, instance=instance)
# get all times from bookings on the provided date
booked_slots = Booking.objects.filter(booking_date=request.session.get(
'dateSelected')).values_list('slot', flat=True)
available_slots = []
for slot in Slots:
if slot[0] not in booked_slots:
available_slots.append(slot[0])
print(available_slots)
if form.is_valid():
form.save()
form = BookingForm
context = {
'form': form,
'available_slots': available_slots,
}
return render(request, "bookingapp/book_form.html", context)
forms.py
class DateForm(forms.ModelForm):
class Meta:
model = Booking
fields = [
'booking_date',
]
widgets = {'booking_date': DateInput()}
class BookingForm(forms.ModelForm):
class Meta:
model = Booking
fields = [
'user',
'slot',
'booking_date',
]
template.html
<form method="POST" name="BookingForm">
{% csrf_token %}
<label for="slot">Choose an available time:</label>
<select name="slot" id="slot">
{% for time in available_slots %}
<option value="{{ time }}">{{ time }}</option>
{% endfor %}
</select>
<input type="submit" value="Save" name="BookingForm" />
</form>
Я пытался использовать BookingForm как {{ форма }} в шаблоне, но тогда я не могу заполнить его только доступным временем на эту дату. Я пытался написать это в BookingForm
def __init__(self, *args, **kwargs):
super(BookingForm, self).__init__(*args, **kwargs)
# get all times from bookings on the provided date
booked_slots = Booking.objects.filter(
'booking_date').values_list('slot', flat=True)
available_slots = []
for slot in Slots:
if slot[0] not in booked_slots:
print(slot[0])
available_slots.append(slot[0])
self.fields['slot'] = forms.ChoiceField(choices=available_slots)
Но получал "слишком много значений для распаковки". Я не понимаю, почему то, как у меня написана форма, не сохраняется в моей базе данных.