Django обрабатывает 2 формы в UpdateView - form_valid не работает (пишет invalid) - Post работает?

У меня есть приложение, в котором я помещаю inline_formset внутрь шаблона объектной формы. Шаблон формы предназначен для всех связанных объектов. Главный объект является GrowthPlan, а связанные объекты являются Response объектами.

Когда я нажимаю кнопку "сохранить", все объекты набора форм (Response) сохраняются должным образом без проблем.

Однако главный объект (GrowthPlan) не сохраняется.

Метод form_invalid(self): вызывается (я вижу сообщение печати в терминале), но нет никаких ошибок, связанных с формой.

Метод form_valid(self): никогда не вызывается.

Если я сохраняю форму в методе post, она сохраняется, как и ожидалось. Но поскольку это UpdateView, я бы хотел сделать это с помощью form_valid и form_invalid; или это неправильный способ?

UpdateView выглядит следующим образом:

HTML моей формы выглядит следующим образом:

    <form method="post" novalidate>
        {% csrf_token %}
        {{ form.as_p }}
        {{ response_formset.management_form }}
        {{ formset.management_form }}
        {% for formset_form in response_formset.forms %} 
            {{ formset_form.as_p }}
        {% endfor %}
        <button type="submit" class="btn btn-primary"><i class="fal fa-clipboard-check"></i> Update Growth Plan</button>
    </form>

Формы forms.py выглядят следующим образом:

class GrowthPlanForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(GrowthPlanForm, self).__init__(*args, **kwargs)

    class Meta:
        model = GrowthPlan
        fields = "__all__"

        widgets = {
            "updated_by": forms.HiddenInput(),
            "evaluation": forms.HiddenInput(),
            "created_by": forms.HiddenInput(),
            "initial_date": DatePickerInput(attrs={"class": "form-control"}),
            "mid_date": DatePickerInput(attrs={"class": "form-control"}),
            "final_date": DatePickerInput(attrs={"class": "form-control"}),
            "expected_growth": forms.TextInput(
                attrs={"class": "form-control"}
            ),
            "actual_growth": forms.TextInput(attrs={"class": "form-control"}),
        }


class ResponseForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(ResponseForm, self).__init__(*args, **kwargs)
        self.fields["question"].queryset = Question.objects.filter(
            id=self.instance.question.id
        )
        self.fields["question"].empty_label = None

    class Meta:
        model = Response
        fields = "__all__"
        widgets = {
            "user": forms.HiddenInput(),
            "growthplan": forms.HiddenInput(),
            "question": forms.HiddenInput(),
            "comment": forms.Textarea(attrs={"class": "form-control"}),
        }

    def clean(self):
        cleaned_data = super().clean()
        comment = cleaned_data.get("comment")
        growthplan = cleaned_data.get("growthplan")
        if growthplan.is_complete and not comment:
            # The comment is required because it should be complete
            self.add_error(
                "comment",
                """
                You must enter a comment before the Growth Plan can be 
                completed.
                """,
            )


ResponseInlineFormset = inlineformset_factory(
    GrowthPlan,
    Response,
    fields=("question", "comment", "user", "growthplan"),
    can_delete=False,
    extra=0,
    form=ResponseForm,
)

Должен ли я обрабатывать это в методе post и игнорировать методы form_valid и form_invalid?

Должен ли я использовать другой CBV?

Почему это происходит form_invalid() когда данные формы действительно действительны?

Я ломаю голову - любое понимание будет оценено по достоинству!

Если я удалю переопределение get_form из GrowthPlanUpdateView, то все заработает как надо, и форма будет помечена как действительная/недействительная, как и ожидалось.

Вернуться на верх