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
, то все заработает как надо, и форма будет помечена как действительная/недействительная, как и ожидалось.