Как сделать форму Django, которая отображает объекты модели для выбора
Ок, я создаю приложение для отеля и в разделе бронирования различных отелей я хочу, чтобы в разделе бронирования был выпадающий список и этот выпадающий список содержал количество номеров в отеле, чтобы пользователь мог забронировать конкретный номер. В каждом отеле разное количество номеров, поэтому я хочу, чтобы в зависимости от количества номеров в отеле, это количество было количеством номеров в выпадающем списке. вот мой код...
регистрация 'models.py'
class Hotel(models.Model):
name = models.CharField(max_length=120, null=True)
hotel_location = models.CharField(max_length=3000, null=True)
number_of_rooms = models.IntegerField(null=True)
number_of_booked_rooms = models.IntegerField(null=True, default=0)
и вот резервирование 'models.py'
class RoomBooking(TrackingModel):
hotel = models.ForeignKey(Hotel, on_delete=models.CASCADE)
room_number = models.ForeignKey('Room', on_delete=models.CASCADE)
class Room(TrackingModel):
hotel = models.ForeignKey(Hotel, on_delete=models.CASCADE)
room_information = models.ForeignKey(RoomBooking, on_delete=models.CASCADE)
room_number = models.IntegerField()
вот мой 'views.py'
def book_a_room(request, *args, **kwargs): hotel_slug = kwargs['slug']. hotel = Hotel.objects.get(slug=hotel_slug)
form = BookingARoomForm()
if request.method == 'POST':
form = BookingARoomForm(request.POST)
if form.is_valid():
if hotel.number_of_booked_rooms < hotel.number_of_rooms:
hotel.no_rooms_available = False
if hotel.no_rooms_available == False:
hotel.number_of_booked_rooms += 1
hotel.save()
room_booking = RoomBooking.objects.create(hotel=hotel, guest=request.user, **form.cleaned_data)
Room.objects.create(hotel=hotel, room_information=room_booking, is_booked=True, checked_in=True, **form.cleaned_data)
return HttpResponse('<h1>You just booked a hotel</h1>')
else:
hotel.no_rooms_available = True
hotel.number_of_booked_rooms = hotel.number_of_rooms
hotel.save()
if hotel.no_rooms_available == True:
return HttpResponse('<h1>This hotel is maximally booked...</h1>')
а также 'forms.py'
class BookingARoomForm(ModelForm):
date_to_check_in = forms.DateField(widget=forms.TextInput(attrs={'type': 'date'}), required=True)
date_to_check_out = forms.DateField(widget=forms.TextInput(attrs={'type': 'date'}), required=True)
room_number = forms.ModelChoiceField(queryset=Room.objects.all(), empty_label="(Nothing)")
class Meta:
model = RoomBooking
fields = ['date_to_check_in', 'date_to_check_out', 'room_number']
Я хочу сделать так, чтобы в форме room_number был выпадающий список с количеством номеров в конкретном отеле, и я хочу, чтобы он был динамическим, чтобы если в отеле 7 номеров, то в выпадающем списке было 7 номеров, а если в другом отеле 10 номеров, то в выпадающем списке было 10 номеров. Подскажите, пожалуйста, как я могу сделать это в представлениях и передать отфильтрованный объект в формы или предложите более логичный способ, чем этот.
Думаю, вы ищете ModelChoiceField.
Особенно обратите внимание на аргумент queryset. В представлении, поддерживающем страницу, вы можете изменять предоставленный вами QuerySet
на основе любых критериев, которые вас интересуют.
Ответ, который вы ищете, нелегко описать здесь поэтому будет лучше, если вы прочтете эту статью Вам нужно использовать jquery/AJAX для динамических значений выпадающего списка.
https://tutorial101.blogspot.com/2020/06/django-chained-dropdown-list-select-box.html