Как мне не выполнить бронирование, если в логическом поле зарезервировано значение True в django? - PullRequest
0 голосов
/ 18 июня 2020

У меня возникли проблемы с тем, чтобы заставить if / else работать в моем приложении django, я хочу проверить, забронировано ли объявление, зарезервировано - это логическое поле, а список - это внешний ключ для класса Booking, где пользователь выбирает листинг для бронирования. Теперь я просто хочу знать, как этот внешний ключ можно проверить, если список зарезервирован, поэтому он не может быть зарезервирован и выдает ошибку.

views.py

@login_required
def profile(request):
    if request.method == "GET":
        tickets = models.Booking.objects.all().filter(user=request.user)
        return render(request, "profile.html", {'form': forms.BookingForm(), 'tickets': tickets})

    else:
        try:
            form = forms.BookingForm(request.POST)
            new_ticket = form.save(commit=False)

            new_ticket.user = request.user
            new_ticket.save()

            messages.success(request, 'Booking Created Successfully')
            return redirect('profile')

        except ValueError:
            return render(request, 'profile.html', {'form': forms.BookingForm()})

models.py

class Listing(models.Model):
    title = models.CharField(max_length=50)
    content = models.TextField(max_length=755)
    price = MoneyField(max_digits=5, decimal_places=2)
    booked = models.BooleanField(default=False)
    seller = models.ForeignKey(User, on_delete=models.CASCADE)
    # avail_days = models.ForeignKey(Days, on_delete=models.CASCADE)

    def __str__(self):
        return self.title


class Booking(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    listing = models.ForeignKey(Listing, on_delete=models.CASCADE) # how to check if listing is booked and deny if it is True ?
    # day = models.OneToOneField(Days, on_delete=models.CASCADE)
    date_booked = models.DateField(auto_now_add=True)

    def __str__(self):
        return self.user.username

1 Ответ

0 голосов
/ 18 июня 2020

Если вы хотите использовать поле booked в модели Listing, вы можете сделать это (вы также можете визуализировать объекты Listing с помощью booked=False):

views.py

@login_required
def profile(request):
    if request.method == "GET":
        tickets = models.Booking.objects.all().filter(user=request.user)
        return render(request, "profile.html", {'form': forms.BookingForm(), 'tickets': tickets})

    else:
        try:
            form = forms.BookingForm(request.POST)
            new_ticket = form.save(commit=False)

            # here you can do something like
            if new_ticket.listing.booked:
                messages.error(request, 'Booked Already')
                return redirect('profile')

            new_ticket.user = request.user
            new_ticket.save()

            messages.success(request, 'Booking Created Successfully')
            return redirect('profile')

        except ValueError:
            return render(request, 'profile.html', {'form': forms.BookingForm()})

models.py

class Listing(models.Model):
    title = models.CharField(max_length=50)
    content = models.TextField(max_length=755)
    price = MoneyField(max_digits=5, decimal_places=2)
    booked = models.BooleanField(default=False)
    seller = models.ForeignKey(User, on_delete=models.CASCADE)
    # avail_days = models.ForeignKey(Days, on_delete=models.CASCADE)

    def __str__(self):
        return self.title


class Booking(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    listing = models.ForeignKey(Listing, on_delete=models.CASCADE) # how to check if listing is booked and deny if it is True ?
    # day = models.OneToOneField(Days, on_delete=models.CASCADE)
    date_booked = models.DateField(auto_now_add=True)

    def __str__(self):
        return self.user.username

    def save(self, *args, **kwargs):
        self.listing.booked = True
        self.listing.save()
        super().save(*args, **kwargs)

...