Встроенный набор форм Django не сохранит форму, добавленную через JS

Я пытаюсь создать страницу, на которой могут быть обновлены "родительский" и связанный с ним объект. Из-за некоторой специфической бизнес-логики "дочерняя" форма имеет определенную пару полей, в которых может быть выбрано только одно из них. Поэтому, когда выбрана опция, JS выдает запрос GET на получение обновленной формы. Проблема в том, что форма извлекается с начальными значениями, а при вызове formset.save() значение формы cleaned_data становится пустым {}.

То, что я проверил:

  1. Formset.management_form в такт;
  2. Все префиксы правильные;
  3. 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

Был бы признателен за любую идею по решению этой проблемы

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