Я пытаюсь создать функцию в моем views.py, которая проверяет отправку даты пользователями по сравнению со значениями, уже отправленными в базу данных:
def make_booking(request):
if request.method == 'POST':
form = BookingForm(request.POST)
if form.is_valid():
new_date = form.cleaned_data.get("date_of_booking")
existing_booking = Booking.objects.get('date_of_booking').items()
for booking in existing_booking:
if booking == new_date:
messages.success(request, "THIS DATE IS ALREADY TAKEN")
else:
form.save()
print('form saved')
if request.user.is_authenticated:
return redirect(get_bookings)
if not request.user.is_authenticated:
return redirect(get_bookings_guest)
Если дата уже существует в базе данных, я хочу, чтобы она показывала сообщение о том, что дата уже существует. Я написал выше, что кажется мне правильным, но я получаю эту ошибку: «Значение исключения:
слишком много значений для распаковки (ожидается 2)".
Пожалуйста, кто-нибудь может мне помочь?
Как насчет фильтрации объектов Booking
в базе данных для всех записей с new_date
? Сделайте сравнение if
на основе количества возвращенных записей; если ноль, new_date
— новая дата.
Предполагая, что new_date
является объектом datetime
, вы можете сделать это:
if form.is_valid():
new_date = form.cleaned_data.get("date_of_booking")
existing_bookings = Booking.objects.filter(date_of_booking=new_date)
if existing_bookings.count() == 0:
form.save()
print('form saved')
else:
messages.success(request, "THIS DATE IS ALREADY TAKEN")
Попробуй это:
if form.is_valid():
new_date = form.cleaned_data.get("date_of_booking")
if Booking.objects.filter(date_of_booking=new_date).exists():
messages.success(request, "THIS DATE IS ALREADY TAKEN")
else:
form.save()
print('form saved')
Это сработало отлично - спасибо! Есть ли у вас какие-либо предложения, если я хочу проверить время бронирования? Поэтому поднимите сообщение, если дата/время уже существуют. Я не хочу на самом деле останавливать бронирование на определенную дату, которую вы видите. Я хочу остановить его, если эта дата и время уже забронированы.
Образец со временем
new_date = form.cleaned_data.get("date_of_booking")
new_time = form.cleaned_data.get("time_of_booking")
if Booking.objects.filter(date_of_booking=new_date).filter(
time_of_booking=new_time).exists():
messages.success(request, "THIS DATE AND TIME IS ALREADY TAKEN")
else:
form.save()
print('form saved')
Спасибо! Это сработало бы, если бы я просто хотел предотвратить дублирование дат. Мои намерения были неоднозначны, поскольку я пытался решить дату, а затем время отдельно.