Форма бронирования на 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)

Но получал "слишком много значений для распаковки". Я не понимаю, почему то, как у меня написана форма, не сохраняется в моей базе данных.

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