Мне нужно сохранить 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>