Мой modelformset сохраняет только первую сгенерированную форму и не добавляет остальные.
У меня есть до 4-5 форм, наборы форм приходят последними, я использовал javascript, чтобы генерировать больше форм по нажатию кнопки. После отправки и валидации, только данные первой формы сохраняются в базе данных, остальные нет, как я могу это исправить, пожалуйста?
Это мой файл views.py
@login_required(login_url='login')
def addItem(request, id) -> render:
res_name = Restro.objects.get(user=request.user)
menuobj = Main.objects.get(restro_name=res_name)
sub_form = createSubCartForm(request.POST)
itemformset = modelformset_factory(Item, form=addItemForm, extra=0, fields=['itname', 'quantity'])
itemform = itemformset(request.POST or None)
vsub_form = createVSubCartForm(request.POST)
vitemformset = modelformset_factory(v_Item, form=addVItemForm, extra=0, fields=['vname'])
vitemform = vitemformset(request.POST or None)
vformset = modelformset_factory(ItemVariation, form=addItemVariationForm, extra=0, fields=['iname', 'varprice', 'quantity'])
vform = vformset(request.POST or None)
if 'nonala' in request.POST:
if request.POST.get('cate1') == 'Non-Ala Carte':
if all([sub_form.is_valid(), itemform.is_valid()]):
global pare
pare = sub_form.save(commit=False)
pare.main_category = Main.objects.get(restro_name=res_name)
pare.save()
for form in itemform:
child = form.save(commit=False)
child.user = request.user
child.sub_category = Sub.objects.get(id=pare.id)
child.save()
return redirect('cust')
elif 'ala' in request.POST:
if request.POST.get('cate2') == 'Ala Carte':
print(request.POST)
context = {
'm_name': menuobj.main_category,
'sub_form': sub_form,
'itemform': itemform,
'vsub_form': vsub_form,
'vitemform': vitemform,
'vform': vform
}
return render(request, 'item_form.html', context)
Это мой файл шаблонов
<form id="non-alacart" action="" method="post" class="hidden">
{% csrf_token %}
<h3 class="text-center" style="font-weight: bold;">Create Sub Cartegory for <span id="mn">{{ m_name }}</span> Category</h3>
<input type="text" name="cate1" id="main_ca" readonly="readonly">
<div id="item">
<div class="row">
<label class="col-form-label text-center">Sub Category Name<br/>{{sub_form.sname}}</label>
<label class="col-form-label text-center">Sub Category Price<br/>{{sub_form.sprice}}</label>
<br>
<label class="col-form-label text-center">Items<br>
<button id="add" type="button" class="btn btn-light link-success border rounded border-success" id="add" type="button" style="width: 119.5px;">
<i class="la la-plus" style="color: rgb(0,0,0);"></i> Add Item
</button>
</label>
</div>
{% if itemform %}
{{ itemform.management_form }}
<div id='item-list' class="row">
{% for form in itemform %}
<div class="item-form">
{{form}}
</div>
{% endfor %}
</div>
<div id="emp-form" class="hidden">{{ itemform.empty_form }}</div>
{% endif %}
</div>
<div class="row">
<div class="col">
<div class="col d-lg-flex justify-content-lg-center">
<button id="nal" class="btn btn-success link-light border rounded border-success" type="submit" name="nonala" style="width: 119.5px;">Submit</button>
</div>
</div>
</div>
</form>
и скрипт для генерации большего количества форм
const addfield = document.getElementById('add');
const totalnewforms = document.getElementById('id_form-TOTAL_FORMS')
addfield.addEventListener('click', additem);
function additem(event){
if (event){
event.preventDefault();
}
const itemformno = document.getElementsByClassName('item-form')
const itemformcount = itemformno.length//+1
const emp_form_list = document.getElementById('item-list')
const emp_form = document.getElementById('emp-form').cloneNode(true)
emp_form.setAttribute('class', 'item-form row')
emp_form.setAttribute('id', `form-${itemformcount}`)
var p = document.getElementsByTagName('p');
for(var i = 0; i < p.length; i++){
p[i].setAttribute('class', 'col');
};
const regex = new RegExp('__prefix__', 'g')
emp_form.innerHTML = emp_form.innerHTML.replace(regex, itemformcount)
emp_form_list.append(emp_form)
totalnewforms.setAttribute('value', itemformcount+1)
}