Django | Показывать только внешние ключи, которые еще не назначены в форме django
Я делаю систему бронирования на django, где пользователь выбирает дату, а затем может посмотреть, какое время доступно на эту дату.
Models.py
class Slot(models.Model):
title = models.CharField(max_length=50)
def __str__(self):
return f'There is a slot at {self.title}'
class Booking(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)
slot = models.ForeignKey(Slot, on_delete=models.CASCADE,
null=True, blank=True, related_name='all_times')
booking_date = models.CharField(max_length=15, default='foo')
def __str__(self):
return f'{self.user} has booked a session at {self.slot.title} on {self.booking_date}'
Где модель слота - это время, которое можно выбрать (например, 9-10, 1-2 и т.д.)
Views.py
def DateView(request):
form = DateForm(request.POST or None)
if form.is_valid():
request.session["dateSelected"] = str(
form.cleaned_data["booking_date"])
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'))
form = BookingForm(request.POST or None, instance=instance)
if form.is_valid():
form.save()
form = BookingForm
context = {
'form': form
}
return render(request, "bookingapp/book_form.html", context)
Forms.py
class DateInput(forms.DateInput):
input_type = 'date'
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',
]
widgets = {'booking_date': forms.HiddenInput()}
Первая форма позволяет пользователю выбрать дату, которая затем приводит его ко второй форме, где он может выбрать желаемый временной интервал.
Это мои шаблоны
book_form.html
<body>
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Save" />
</form>
</body>
date_form.html
<form method="POST">
{% csrf_token %}
<input type="date" id="booking_date" name="booking_date">
<!-- {{ form.as_p }} -->
<input id="check" type="submit" value="Check" />
</form>
def __init__(self, *args, **kwargs):
super(BookingForm, self).__init__(*args, **kwargs)
self.fields['slot'].queryset = Slot.objects.filter(
Q(all_times__slot__isnull=True)
)
Добавив это в BookingForm, я могу показать только время, которое еще не было выбрано (из этого вопроса Django | Don't show the foreign key valules in dropdown which are already assigned), но я не могу сделать это специфичным для выбранной даты