【发布时间】:2021-06-28 09:39:25
【问题描述】:
我正在尝试过滤并检查两个日期是否已经存在,例如我们有这个现有的两个日期28-6-2021 11:30 PM 和 30-6-2021 11:30 PM,我必须阻止用户选择包含在这两个现有日期之间的任何日期例如,如果用户尝试选择 29-6-2021 12:00 PM 到 1-7-2021 12:00 PM ,它应该会引发错误 the dates already taken !
这是我的models.py
class Booking(models.Model):
room_no = models.ForeignKey(Room,on_delete=models.CASCADE,blank=True,related_name='rooms')
check_in = models.DateTimeField(default=datetime.now)
check_out = models.DateTimeField()
#my form
class BookingForm(forms.ModelForm):
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 = ['check_in','check_out']
这是我的 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)
if room_number.rooms.filter(check_in__gte=check_in,check_out__gte=check_out).exists():
#if room_number.rooms.filter(Q(check_in__gte=check_in, )|Q(check_out__lte=check_out)).exists(): #but still doesnt work
return HttpResponse('taken! sorry , try another room please')
obj.room_no = room_number
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})
但不起作用,该项目是针对酒店和预订应用程序的,我必须防止用户选择错误的日期!请问有可能吗? 非常感谢..
【问题讨论】:
-
您的
check_in和check_out日期是多少?或日期时间?你从用户那里得到什么?如果您收到dateobj 将其转换为datetime然后使用您的datetime字段进行过滤。发生这种情况是因为您将date与datetime进行比较 -
它们是日期时间