Inlineformset_Factory сохраняет данные как дополнительные - PullRequest
0 голосов
/ 12 мая 2019

Мне нужно сохранить 2 модели в одной форме.И отношение - это отношение внешнего ключа.Я использовал inlineformset_factory для этого.И я хочу «добавить новый элемент» для формы внешнего ключа.

, если inlineformset factory: extras = 1 Когда я ввожу только значение для внешнего ключа;Все хорошо.Когда я ввожу 3 или более значений для внешнего ключа;Сохраняйте только последний.

, если inlineformset_factory: extras 3 Когда я ввожу 3 значения для внешнего ключа;Все хорошо.но когда я пытаюсь ввести запись 4 или более, сохраните только 3 элемента.

моя форма

class TestForm(ModelForm):
    class Meta:
        model = ciranta
        exclude = ()


TestFormSet = inlineformset_factory(parentModel, childModel, form=CirantaForm, extra=1)

мой взгляд

class TestCreate(CreateView):
    model = parentModel
    fields = ['var1','var2','var3']
    success_url = reverse_lazy('home')


    def get_context_data(self, **kwargs):
        data = super(TestCreate, self).get_context_data(**kwargs)
        if self.request.POST:
            data['childModel'] = TestFormSet(self.request.POST)
        else:
            data['childModel'] = TestFormSet()
        return data

    def form_valid(self, form):
        context = self.get_context_data()
        childModel = context['childModel']
        with transaction.atomic():
            self.object = form.save()

            if chilModel.is_valid():
                childModel.instance = self.object
                childModel.save()

        return super(TestCreate, self).form_valid(form)

мой шаблон:

            <table class="table">
            <br>
                {{ childModel.management_form }}

                {% for form in childModel.forms %}
                    {% if forloop.first %}
                        <thead class="thead-light">
                        <tr>
                            {% for field in form.visible_fields %}
                                <th>{{ field.label|capfirst }}</th>
                            {% endfor %}
                        </tr>
                        </thead>
                    {% endif %}
                    <tr class="{% cycle row1 row2 %} formset_row">
                        {% for field in form.visible_fields %}
                            <td>
                                {# Include the hidden fields in the form #}
                                {% if forloop.first %}
                                    {% for hidden in form.hidden_fields %}
                                        {{ hidden }}
                                    {% endfor %}
                                {% endif %}
                                {{ field.errors.as_ul }}
                                {{ field }}
                            </td>
                        {% endfor %}
                    </tr>
                {% endfor %}
            </table>

Обновление: в шаблоне

<script src="{% static 'js/jquery-1.11.0.min.js' %}"></script>
    <script src="{% static 'js/jquery.formset.js' %}"></script>
    <script type="text/javascript">
        $('.formset_row').formset({
            addText: 'Add',
            deleteText: 'Delete',
            prefix: 'test_set'
        });
    </script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...