Reputation: 592
I'm working on a project for a hotel , i have to prevent from select wrong dates for example
check_in = 27-6-2021 2:30PM
check_out = 30-6-2021 2:30PM
i want to prevent from selecting any date into that two dates for example check_in=28-6-2021 2:30PM check_out=2-7-2021 2:30PM
and so on ..
this is my Booking
model
class Booking(models.Model):
admin = models.ForeignKey(User,on_delete=models.CASCADE)
room_no = models.ForeignKey(Room,on_delete=models.CASCADE,blank=True,related_name='rooms')
takes_by = models.ManyToManyField(Vistor)
check_in = models.DateTimeField(default=datetime.now)
check_out = models.DateTimeField()
#my form
class BookingForm(forms.ModelForm):
takes_by = forms.ModelMultipleChoiceField(queryset=Vistor.objects.all())
check_in = forms.DateTimeField(required=True,input_formats=['%Y-%m-%dT%H:%M','%Y-%m-%dT%H:M%Z'],widget=forms.DateTimeInput(attrs={'type':'datetime-local'}))
check_out = forms.DateTimeField(required=True,input_formats=['%Y-%m-%dT%H:%M','%Y-%m-%dT%H:M%Z'],widget=forms.DateTimeInput(attrs={'type':'datetime-local'}))
class Meta:
model = Booking
fields = ['takes_by','check_in','check_out']
my views.py
@login_required
def add_booking(request,room_no):
room_number = get_object_or_404(Room,room_no=room_no)
if request.method == 'POST':
form = BookingForm(request.POST)
if form.is_valid():
obj = form.save(commit=False)
obj.room_no = room_number
obj.admin = request.user
obj.save()
messages.success(request,f'room number {room_number} added')
form = BookingForm()
return render(request,'booking/add_booking.html',{'form':form,'room_number':room_number})
what should i do to prevent from takes a room in an existing date twice ? thank you so much
Upvotes: 0
Views: 861
Reputation: 66
You can use a clear function in your form:
def clean_check_in(self):
check_in = self.cleaned_data['check_in']
excluded_date_start = #the begining date of exclusion
excluded_date_end = # the end date of exclusion
if check_in > excluded_date_start and check_in < excluded_date_end :
raise ValidationError("not possible to book")
return check_in
Upvotes: 0
Reputation: 7330
You can check if the check in check out for the particular room already exists or not like this.
from django.db.models import Q
def add_booking(request,room_no):
room_number = get_object_or_404(Room,room_no=room_no)
if request.method == 'POST':
form = BookingForm(request.POST)
if form.is_valid():
check_in = form.cleaned_data.get('check_in')
check_out = form.cleaned_data.get('check_out')
if room_number.rooms.filter(Q(check_in_gte=check_in)|Q(check_out_lte=check_out)).exists():
return HttpResponse('invalid check in out date')
obj = form.save(commit=False)
obj.room_no = room_number
obj.admin = request.user
obj.save()
Upvotes: 1