【问题标题】:django form validation with parameters from viewdjango 表单验证与视图中的参数
【发布时间】:2013-09-25 14:41:04
【问题描述】:

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

假设我有 2 间公寓可供预订。 用户在预订公寓时应选择 start_date 和 end_date。 当我验证我的预订表格时,我会检查几个条件,其中之一是查看开始日期和结束日期之间是否有预订天数。如果存在则引发错误。对于数据库中的一间公寓来说,它工作得很好。 它看起来像这样:

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

但问题是,当我添加另一个公寓时,如果用户预订日期已经为其他公寓预订,则每次都会引发错误。所以我需要检查那间公寓的身份证,然后检查预订是否与那间公寓有关。所以如果我的公寓 id=2 那么应该是这样的:

between = Booking.objects.filter(booking_start__gte=form_booking_start, booking_end__lte=form_booking_end, apartman__id=2).exists()

问题是,我不知道如何将该 id 的值从视图传递到我的表单。 我的视图看起来像这样:

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_id 的值传递给我的表单?

【问题讨论】:

  • 这应该给你一个想法:stackoverflow.com/questions/9723465/…
  • 我已经看过那个帖子,但它并没有真正帮助我。我试图修改我的代码看起来像这样 FORMS.PY def __init__(self,*args,**kwargs): form_apartman_id=kwargs.pop("apartman_id") super(BookingForm, self).__init__(*args,** kwargs) VIEWS.PY f = BookingForm(apartman_id=form_apartman_id) 但它给了我与未定义帖子全局名称'form_apartman_id'相同的错误我真的不知道要改变什么才能让它工作。 ://

标签: django


【解决方案1】:

您的__init__() 方法应该在实例上设置参数并在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)

【讨论】:

    猜你喜欢
    • 2011-03-06
    • 2017-11-11
    • 1970-01-01
    • 2020-05-25
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多