Django model formset - в методе post отсутствуют данные для первой вложенной дочерней формы

Я использую Django 3.2 и crispy-forms 1.11.2

У меня есть модель и форма, определенные следующим образом:

/path/to/myapp/models.py

class Foo(models.Model):
    pass


class FooChild(models.Model):
    parent = models.ForeignKey(Foo, on_delete=models.CASCADE)
    title = models.CharField(max_length=16)

/path/to/myapp/forms.py

class FooChildForm(ModelForm):
    
    class Meta:
        model = FooChild
        fields = "__all__"




class FooChildFormSetHelper(FormHelper):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.form_method = 'post'
        self.layout = Layout(
            'title',
        )
        self.render_required_fields = True   

 

/path/to/myapp/views.py

class FooCreateView(CreateView):
    model = Foo
    

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.choice_formset = inlineformset_factory(Foo, Child, form=FooChild, extra=9)
        


    def get(self, request, *args, **kwargs):
        form = self.form_class()

        p = self.model()
        formset = self.choice_formset(instance=p)   
        helper = ChildFormSetHelper()
        helper.template = 'bootstrap/table_inline_formset.html'
        helper.form_tag = False

        return render(request, 'myapp/create.html', {'form' : form, 'formset': formset, 'helper': helper})



def post(self, request, *args, **kwargs):

    form = self.form_class(request.POST or None)

    if form.is_valid():
        new_foo = form.save(commit=False)     
        new_foo.creator = request.user
        new_foo.save()     

        formset = self.choice_formset(request.POST or None, instance=new_foo)
        formset.save()  

        # <- formset loses first element
        # request.POST.get('choices-0-title')
        # 'Choice Two' <- (expected 'Choice One')
        # request.POST.get('choices-1-title')
        # 'Choice Three'
        # request.POST.get('choices-2-title')
        # 'Choice Four'
        # request.POST.get('choices-3-title')
        # 'Choice Five'

/path/to/myapp/templates/myapp/create.html

{% block content %}
<div class="container-lg">

  <form id="frm-foo-create" method="post">

    {% csrf_token %}  

    <div class="row" style="margin: 30px 0px;">
    
      <div class="col-lg-12">
        <h2>Create a New Foo</h2>
        <br />

        {% crispy form %}
        {{ form|as_crispy_errors }}

        {% crispy formset helper %}

        {{ formset.management_form }}
      </div> <!-- col-lg-12-->
    </div> <!-- row -->


    <div class="row" style="margin: 30px 0px;">
        <div class="col-lg-2">
            <input style="width:100%; padding-left: 20px;" type="submit" name="submit" value="Submit" class="btn btn-primary" id="btn-foo-create">
        </div>                
    </div>

  </form>

</div> <!-- container -->

{% endblock content %}

Когда отображается страница, и вводятся следующие варианты выбора:

  • Выбор один
  • Выбор второй
  • Выбор третий
  • Выбор четвертый
  • Выбор пять

Как видно, когда на странице отображения вводятся следующие варианты, первый элемент отсутствует в методе post().

Почему это происходит - и как мне к этому прийти?

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