Как переопределить значение поля перед проверкой? - PullRequest
1 голос
/ 14 октября 2010

У меня есть форма, для которой мне нужно установить несколько значений перед проверкой. Я пытаюсь:

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

Но это не работает. Если я исключаю поле '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 Ответ

1 голос
/ 14 октября 2010

Хорошо, надеюсь, теперь я правильно понял проблему:

У вас есть ReservationForm, в котором нет поля user и is_reservation. Из-за этого не имеет никакого смысла устанавливать initial={'user': ...}, потому что user не является частью этой формы (и не является is_reservation).

С другой стороны, у вас есть модель Reservation, которая заполняется некоторыми значениями формы и дополнительным идентификатором пользователя, а также логическим значением is_reservation.

Итак, обычно вы пишете что-то вроде этого:

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

Обратите внимание, что это только пример. Я еще не видел ваш класс модели, поэтому ваша модель может выглядеть немного иначе. Но я думаю, что вы сможете адаптировать его.

Обновление

Я думаю, что может сработать следующее (но вам придется исключить user и is_reservation, как вы уже упоминали).

form = ReservationForm(request.POST)
reservation = form.save(commit=False)
reservation.user = request.user
reservation.is_reservation = True
reservation.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...