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()
.
Почему это происходит - и как мне к этому прийти?