微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何检查开始日期和结束日期是否需要然后引发错误 django

如何解决如何检查开始日期和结束日期是否需要然后引发错误 django

我正在为一家酒店做一个项目,例如我必须防止选择错误的日期

check_in = 27-6-2021 2:30PM 
check_out = 30-6-2021 2:30PM 

我想防止在这两个日期中选择任何日期,例如 check_in=28-6-2021 2:30PM check_out=2-7-2021 2:30PM 等等.. 这是我的 Booking 模型

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,widget=forms.DateTimeInput(attrs={'type':'datetime-local'}))
    class Meta:
        model = Booking
        fields = ['takes_by','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)
            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})

我应该怎么做才能防止在现有日期中两次占用一个房间? 非常感谢

解决方法

您可以像这样检查特定房间的入住退房是否已经存在。

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()  
,

您可以在表单中使用 clear 函数:

        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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?