使用视图中的参数进行django表单验证

使用视图中的参数进行django表单验证,django,Django,我在Django中的表单验证有问题 假设我有两套公寓,可以选择预订。 用户在预订公寓时应选择开始日期和结束日期。 当我验证我的预订表格时,我检查了几个条件,其中之一就是查看在开始日期和结束日期之间是否有预订天数。如果存在,则会引发错误。数据库中的一个公寓工作正常。 看起来是这样的: class BookingForm(forms.ModelForm): class Meta: model = Booking fields = ['booking_star

我在Django中的表单验证有问题

假设我有两套公寓,可以选择预订。 用户在预订公寓时应选择开始日期和结束日期。 当我验证我的预订表格时,我检查了几个条件,其中之一就是查看在开始日期和结束日期之间是否有预订天数。如果存在,则会引发错误。数据库中的一个公寓工作正常。 看起来是这样的:

class BookingForm(forms.ModelForm):

    class Meta:
        model = Booking
        fields = ['booking_start', 'booking_end', 'gsm']

    def clean(self):
        cleaned_data = self.cleaned_data
        form_booking_start = cleaned_data.get("booking_start")
        form_booking_end = cleaned_data.get("booking_end")               
        the_apartment = Apartman.objects.get(id=2)
        between = Booking.objects.filter(booking_start__gte=form_booking_start, booking_end__lte=form_booking_end).exists()


        if form_booking_start and form_booking_end:
            ...

            if between:
                raise forms.ValidationError("It seems like there are days that are already booked between your booking start and booking end. Please take care of it and book days that are not already booked.")

        return cleaned_data
between = Booking.objects.filter(booking_start__gte=form_booking_start, booking_end__lte=form_booking_end, apartman__id=2).exists()
def booking(request, apartman_id):
    a = Apartman.objects.get(id=apartman_id)
    if request.method == 'POST':
            f = BookingForm(request.POST)
            if f.is_valid():
        ....
    else:
        f = BookingForm()
但问题是,当我添加另一个公寓时,如果用户预订了其他公寓的日期,则每次都会出现错误。所以我需要检查一下那套公寓的id,然后检查一下预订是否与那套公寓有关。所以如果我的公寓id=2,那么应该是这样的:

class BookingForm(forms.ModelForm):

    class Meta:
        model = Booking
        fields = ['booking_start', 'booking_end', 'gsm']

    def clean(self):
        cleaned_data = self.cleaned_data
        form_booking_start = cleaned_data.get("booking_start")
        form_booking_end = cleaned_data.get("booking_end")               
        the_apartment = Apartman.objects.get(id=2)
        between = Booking.objects.filter(booking_start__gte=form_booking_start, booking_end__lte=form_booking_end).exists()


        if form_booking_start and form_booking_end:
            ...

            if between:
                raise forms.ValidationError("It seems like there are days that are already booked between your booking start and booking end. Please take care of it and book days that are not already booked.")

        return cleaned_data
between = Booking.objects.filter(booking_start__gte=form_booking_start, booking_end__lte=form_booking_end, apartman__id=2).exists()
def booking(request, apartman_id):
    a = Apartman.objects.get(id=apartman_id)
    if request.method == 'POST':
            f = BookingForm(request.POST)
            if f.is_valid():
        ....
    else:
        f = BookingForm()
问题是,我不知道如何将该id的值从视图传递到表单。 我的观点是这样的:

class BookingForm(forms.ModelForm):

    class Meta:
        model = Booking
        fields = ['booking_start', 'booking_end', 'gsm']

    def clean(self):
        cleaned_data = self.cleaned_data
        form_booking_start = cleaned_data.get("booking_start")
        form_booking_end = cleaned_data.get("booking_end")               
        the_apartment = Apartman.objects.get(id=2)
        between = Booking.objects.filter(booking_start__gte=form_booking_start, booking_end__lte=form_booking_end).exists()


        if form_booking_start and form_booking_end:
            ...

            if between:
                raise forms.ValidationError("It seems like there are days that are already booked between your booking start and booking end. Please take care of it and book days that are not already booked.")

        return cleaned_data
between = Booking.objects.filter(booking_start__gte=form_booking_start, booking_end__lte=form_booking_end, apartman__id=2).exists()
def booking(request, apartman_id):
    a = Apartman.objects.get(id=apartman_id)
    if request.method == 'POST':
            f = BookingForm(request.POST)
            if f.is_valid():
        ....
    else:
        f = BookingForm()
那么,最后,我如何将该apartman\u id的值传递给我的表单呢?

您的
\uuuu init\uuuuuuuuuu()
方法应该在实例上设置参数,并在
clean()
方法中使用它

FORMS.PY

def __init__(self,*args,**kwargs): 
    #use self to store id
    self.form_apartman_id=kwargs.pop("apartman_id") 
    super(BookingForm, self).__init__(*args,**kwargs)

def clean(self):
   ....
   the_apartment = Apartman.objects.get(id=self.form_apartman_id)
Views.py

def booking(request, apartman_id):
    a = Apartman.objects.get(id=apartman_id)
    if request.method == 'POST':
            f = BookingForm(apartman_id=apartman_id, request.POST)
            if f.is_valid():
        ....
    else:
        f = BookingForm(apartman_id=apartman_id)

这应该给你一个想法:我已经看到了那篇文章,但它对我没有多大帮助。我试图使我的代码看起来像这样:FORMS.PY def uu init uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuoself,*args,**kwargs:form apartman_id=kwargs.pop(“apartman_id”)super(BookingForm,self)。\uuuuuuuuu init(*args,**kwargs,**但它给我的错误与未定义“form_apartman_id”的博文全局名称相同。我真的不确定要更改什么才能使其工作:/