Вложенные формы Django

У меня проблемы с пониманием того, как создавать вложенные формы. У меня есть две модели: Poll и Question (внешний ключ для Poll находится внутри модели Question). Я хочу, чтобы можно было динамически добавлять несколько вопросов для опроса в одну форму. Я уже пытался сделать это с помощью inlineform_factory, но столкнулся с проблемами при сохранении формы. Сейчас у меня переусложненный код, который выбрасывает MultiValueDictError после сохранения опроса во второй раз. Я подумал, что может быть есть какой-то другой способ. Вот мой код

models.py

class Question(models.Model):
    type_choices = (
        ('text', 'Текстовый'),
        ('integer', 'Числовой'),
    )

    type = models.CharField(verbose_name=u'Тип вопроса', choices=type_choices,     max_length=70)
    text = models.CharField(verbose_name=u'Текст вопроса', max_length=255)
    poll = models.ForeignKey('Poll', on_delete=models.CASCADE,     related_name='questions')


class Poll(BaseFields):
    objects = models.Manager()
    published = PublishedManager()

    title = models.CharField(verbose_name=u'Заголовок', max_length=70)
    date_from = models.DateTimeField(u'Дата начала')
    date_to = models.DateTimeField(u'Дата окончания')
    status = models.IntegerField(choices=Status.choices, default=0)

    def status_name(self):
        return dict(Status.choices).get(self.status)

    def update_url(self):
        return reverse('poll_update', args=(self.id, ))

forms.py

QuestionInlineFormSet = inlineformset_factory(Poll, Question, extra=1, can_delete=False,
                                              fields=('type', 'text', 'poll'),
                                              widgets={
                                                  'type': w.Select(attrs={'class': 'form-control'}),
                                                  'text': w.TextInput(attrs={'class': 'form-control'}),
                                              })


class PollForm(CommonForm):

    class Meta(CommonForm.Meta):
        model = Poll

views.py

class Create(BaseCreateView):
    template_name = 'back/poll/poll.html'
    page_title = 'Создание опроса'
    model = Poll
    form_class = PollForm

    def form_valid(self, form):
        result = super(Create, self).form_valid(form)
        questions_formset = QuestionInlineFormSet(data=form.data, instance=self.object, prefix='questions_formset')
        if questions_formset.is_valid():
            questions_formset.save()
        return result

    def get_context_data(self, **kwargs):
        context = super(Create, self).get_context_data(**kwargs)
        context['questions_formset'] = QuestionInlineFormSet(prefix='questions_formset')
        return context


class Update(BaseUpdateView):
    template_name = 'back/poll/poll.html'
    page_title = 'Редактирование опроса'
    model = Poll
    form_class = PollForm

    def form_valid(self, form):
        result = super(Update, self).form_valid(form)
        questions_formset = QuestionInlineFormSet(data=form.data, instance=self.object, prefix='questions_formset')
        if questions_formset.is_valid():
            questions_formset.save()
        return result

    def get_context_data(self, **kwargs):
        context = super(Update, self).get_context_data(**kwargs)
        context['questions_formset'] = QuestionInlineFormSet(instance=self.get_object(), prefix='questions_formset')
        return context

poll.html

{% extends 'back/base/form/base.html' %}
{% block form %}
    {% include "back/includes/status_buttons.html" %}
    <div class="row">
        <div class="col-md-7">
            <div class="row" style="margin-bottom: 15px;">
                <div class="col-md-12">
                    {% include 'back/includes/status_label.html' %}
                </div>
            </div>
            {% include "back/base/form/field.html" with field=form.title %}
            {% include "back/base/form/datetime_field.html" with field=form.date_from %}
            {% include "back/base/form/datetime_field.html" with field=form.date_to %}
            {{ questions_formset.management_form }}
            {% for question_form in questions_formset %}
                {% include "back/poll/question.html" with form=question_form %}
            {% endfor %}
            <div style="float: right; margin-right: 45px">
                <button class="btn btn-success add-form-row">Добавить вопрос</button>
            </div>
        </div>
    </div>
{% endblock %}

question.html

Вот фото того, как это должно выглядеть Here's a photo of what it should look like

Опять же, я хочу, чтобы можно было добавлять вопросы, удалять их, сохранять форму. И после того, как я нажимаю на опрос в списке всех опросов и перехожу на страницу редактирования, я хочу, чтобы там были уже добавленные вопросы.

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