代码之家  ›  专栏  ›  技术社区  ›  mpen

如何在验证前覆盖字段值?

  •  1
  • mpen  · 技术社区  · 14 年前

    我有一个表单,在验证前需要为其设置一些值。我正在努力:

    if request.method == 'POST':
        reservation_form = ReservationForm(request.POST, initial={'is_reservation':True, 'user':request.user})
    

    但它不起作用。如果我从(模型)表单中排除“用户”字段,我会得到一个空约束错误,如果我真的包括它,我会得到一个验证错误。所以它忽略了初始值,因为我已经排除了字段,或者request.post数据胜过它,即使这个值没有被发布。

    那我该怎么做呢?


    class ReservationForm(ModelForm): # TODO: abstract this and shipment form
        service_types = MultipleChoiceField(widget=MultiColumnCheckboxSelect(columns=2), choices=ServiceTypes,
        initial=[ServiceTypes.OPEN_TRANS], error_messages={'required': 'Please select at least one service type.'})
        payment_methods = MultipleChoiceField(widget=MultiColumnCheckboxSelect(columns=2), choices=PaymentMethods,
        error_messages={'required': 'Please select at least one payment method.'})
        payment_times = MultipleChoiceField(widget=MultiColumnCheckboxSelect(columns=2), choices=PaymentTimes, required=True,
        error_messages={'required': 'Please select at least one payment type.'})
    
        class Meta:
        model = Shipment
        exclude = ['headline', 'created', 'updated', 'expiry_date', 'status', 'accepted_bid', 'pickup_address', 'dropoff_address', 'billing_address', 'target_price']
        widgets = {
            'pickup_earliest': TextInput(attrs={'class':'date'}),
            'pickup_latest': TextInput(attrs={'class':'date'}),
            'dropoff_earliest': TextInput(attrs={'class':'date'}),
            'dropoff_latest': TextInput(attrs={'class':'date'}),
            'additional_info': WarningTextArea,
        }
    
    1 回复  |  直到 14 年前
        1
  •  1
  •   tux21b    14 年前

    好吧,我希望我现在能正确理解问题:

    你有一个 ReservationForm 没有 user 而且没有 is_reservation 字段。正因为如此,设置没有任何意义 initial={'user': ...} 因为 用户 不是那种形式的一部分 ISSO预留 )

    另一方面,你有一个 Reservation 由表单的某些值和附加用户ID以及 ISSO预留 布尔函数。

    所以,一般来说,你会写这样的东西:

    form = ReservationForm() # you migth want to set inital values here
    if request.method == 'POST':
        form = ReservationForm(request.POST)
        if form.is_valid():
            data = form.cleaned_data
            reservation = Reservation() # create a new model
    
            # copy the values from the form to your new model
            reservation.payment_method = data['payment_methods']
            reservation.payment_time = data['payment_time']
    
            # set some additional values for the model (which are required)
            reservation.user_id = request.session['user_id'] # for example
            reservation.is_reservation = True
    
            # save the reservation (all required fields, including the user_id are now set)
            reservation.save()
    

    请注意,这只是一个例子。我还没看过你的模型课,所以你的模型可能看起来有点不同。但我认为你能适应它。

    更新

    我认为以下可能有效(但您必须排除 用户 ISSO预留 正如你之前提到的)。

    form = ReservationForm(request.POST)
    reservation = form.save(commit=False)
    reservation.user = request.user
    reservation.is_reservation = True
    reservation.save()