Django: Как UpdateView изменяет значение полей, которые исключены в ModelForm? - PullRequest
0 голосов
/ 06 февраля 2019

Здесь у меня есть класс запроса на поездку, и у него есть исходный номер пассажира и общее количество пассажиров.Я разрешаю пользователю изменять значение исходного номера пассажира с помощью ModelForm, а в UpdateView я бы хотел, чтобы общее количество пассажиров равнялось исходному количеству пассажиров, только что полученному от ModelForm.Например: ModelForm :

class RequestOwnerForm(ModelForm):
    class Meta:
        model = OwnerRequest
        fields = [

            'passenger_num',


        labels = {

            'passenger_num': 'How many passengers do you have?',

        }

и UpdateView :

class OwnerRequestEditView(LoginRequiredMixin, generic.UpdateView):

    model = OwnerRequest
    template_name = 'ride/request_edit.html'
    form_class = RequestOwnerForm
    success_url = reverse_lazy('ride:view_requests')

    def form_invalid(self, form):
        print("form is invalid")
        return HttpResponse("form is invalid.. this is just an HttpResponse object")

    def form_valid(self, form):
        pk = self.kwargs.get('pk')
        request = get_object_or_404(OwnerRequest, pk=pk)
        if request.status == 'open':
            request.passenger_num = form.cleaned_data['passenger_num']
            passenger_num = form.cleaned_data['passenger_num']
            request.total_passenger = passenger_num # I want total_passenger equals to passenger_num
            request.save()
            return super().form_valid(form)

Но тот факт, что total_passenger не изменяется.

Может ли кто-нибудь помочь мне?Спасибо!

1 Ответ

0 голосов
/ 06 февраля 2019

Вы обновляете номер, затем вызываете super, чтобы сохранить форму, которая перезаписывает только что сохраненное вами значение оригинальным.

Я не уверен, зачем вам два поля с одинаковым значением, но вам нужно установить это для экземпляра, который уже был получен представлением.Вы должны позволить представлению обновлять другие поля и сохранять.

def form_valid(self, form):
    if request.status == 'open':
        form.instance.total_passenger = form.cleaned_data['passenger_num']
    return super().form_valid(form)
...