Как проверить отправку формы Django на соответствие значению в таблице базы данных

Я пытаюсь создать функцию в моем 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)".

Пожалуйста, кто-нибудь может мне помочь?

Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Потяните за рычаг выброса энергососущих проектов
Потяните за рычаг выброса энергососущих проектов
На этой неделе моя команда отменила проект, над которым я работал. Неделя усилий пошла насмарку.
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
0
0
59
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Как насчет фильтрации объектов 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")

Спасибо! Это сработало бы, если бы я просто хотел предотвратить дублирование дат. Мои намерения были неоднозначны, поскольку я пытался решить дату, а затем время отдельно.

ladcode2022 14.02.2023 12:47
Ответ принят как подходящий

Попробуй это:

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')

Это сработало отлично - спасибо! Есть ли у вас какие-либо предложения, если я хочу проверить время бронирования? Поэтому поднимите сообщение, если дата/время уже существуют. Я не хочу на самом деле останавливать бронирование на определенную дату, которую вы видите. Я хочу остановить его, если эта дата и время уже забронированы.

ladcode2022 14.02.2023 12:19

Образец со временем

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')

Другие вопросы по теме