Встроенный набор форм Django не сохранит форму, добавленную через JS
Я пытаюсь создать страницу, на которой могут быть обновлены "родительский" и связанный с ним объект.
Из-за некоторой специфической бизнес-логики "дочерняя" форма имеет определенную пару полей, в которых может быть выбрано только одно из них.
Поэтому, когда выбрана опция, JS выдает запрос GET на получение обновленной формы.
Проблема в том, что форма извлекается с начальными значениями, а при вызове formset.save() значение формы cleaned_data становится пустым {}.
То, что я проверил:
Formset.management_formв такт;- Все префиксы правильные;
Formset.dataвыглядит хорошо;
Если я изменю какие-либо данные формы, вставленные динамически, и отправлю их, они сохранятся, как ожидалось. Таким образом, проблема, по-видимому, заключается в том, как наборы форм используют логику form.has_changed().
Это тоже не сработает:
class CustomFormset(forms.BaseInlineFormSet):
for form in self.forms:
form.empty_permitted = False
Немного кода может оказаться полезным:
class ParentForm(forms.ModelForm):
title = forms.CharField()
description = forms.CharField()
class ChildForm(forms.ModelForm):
item = forms.ModelChoiceField()
item_type = forms.ModelChoiceField()
# ---------- One of these fields to be selected
ChildrenInlineFormset = inlineformset_factory(
models.Parent,
models.Child,
form=ChildForm,
formset=CustomFormset,
min_num=1,
max_num=50,
extra=0,
can_delete=True
)
ПРОСМОТР:
@require_http_methods(["GET", "POST"])
def parent_update_view(request, pk):
if request.method == "POST":
parent = get_object_or_404(models.Parent, pk=pk)
parent_form = forms.ParentForm(request.POST, instance=parent)
child_item_formset = forms.ChildInlineFormset(
request.POST,
instance=parent
)
if parent_form.is_valid() and child_item_formset.is_valid():
with transaction.atomic():
parent_form.save()
child_item_formset.save()
return redirect(reverse("parent_detail", kwargs={"pk": parent.pk}))
else:
parent = get_object_or_404(models.Parent, pk=pk)
parent_form = forms.ParentForm(instance=parent)
child_item_formset = forms.ChildInlineFormset(
request.GET or None,
instance=parent
)
return render(request, "parent_update.html",
{
"parent_form: parent_form,
"child_item_formset": child_item_formset
}
)
В журнале отладки отображаются необработанные данные:
ДАННЫЕ НАБОРА ФОРМ:
<QueryDict: {
'csrfmiddlewaretoken': ['token_str'],
'name': ['sample title'],
'description': [''],
'items-TOTAL_FORMS': ['2'],
'items-INITIAL_FORMS': ['1'],
'items-MIN_NUM_FORMS': ['1'],
'items-MAX_NUM_FORMS': ['50'],
'items-0-id': ['65'],
'items-0-parent': ['8'],
'items-0-item': ['322'],
'items-0-item_type': [''],
'items-0-quantity': ['1'],
'items-1-id': [''],
'items-1-parent': ['8'],
'items-1-item': [''],
'items-1-item_type': ['26'],
'items-1-quantity': ['1']
}>
ОЧИЩЕННЫЕ ДАННЫЕ
[
{
'item': <Item: Object(10)>,
'item_type': None,
'quantity': 1,
'id': <Child: 'sample title' / None>,
'DELETE': False,
'parent': <Parent: sample title>
},
# ----- second form data ----------
{}
]
Также second_form.has_changed() --> False
Был бы признателен за любую идею по решению этой проблемы