Как проверить отправку формы 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 есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
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')

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