ManagementForm data missing error while formset validation
I get this error when I try to save a parent form with intermediate m2m table child formset. I don't know how to solve because the lack of information about this error in Traceback. Please help!
models.py
class Material(models.Model):
name = models.CharField(max_length=200)
familiy = models.ForeignKey(Material_family, on_delete=models.CASCADE, null=True)
…
class Purchase(models.Model):
number = models.IntegerField()
date = models.DateField()
…
class Purchase_detail(models.Model):
material = models.ForeignKey(Material, on_delete=models.CASCADE)
purchase = models.ForeignKey(Purchase, on_delete=models.CASCADE)
quantity = models.IntegerField()
unit_value = models.IntegerField(default=0)
forms.py
class PurchaseModelForm(forms.ModelForm):
class Meta:
model = Purchase
fields = (‘number’,’date’ , ’…’)
def __init__(self, *args, **kwargs):
super(PurchaseModelForm, self).__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_tag = False
self.helper.form_id = 'id-purchase-form'
self.helper.form_method = 'post'
class Purchase_detailModelForm(forms.ModelForm):
class Meta:
model = Purchase_detail
fields = ('material','quantity','unit_value')
def __init__(self, *args, **kwargs):
super(Purchase_detailModelForm, self).__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_tag = False
self.helper.form_id = 'id-purchase-form'
self.helper.form_method = 'post'
self.helper.form_class = 'form-inline'
self.helper.field_template = 'bootstrap3/layout/inline_field.html'
DetailFormSet = forms.inlineformset_factory(Purchase, Purchase_detail, form=Purchase_detailModelForm, extra=1)
views.py
def purchase_new(request, purchase_id=None, *args, **kwargs):
template = 'erp/purchase_form.html'
if purchase_id:
inst = Purchase.objects.get(pk=purchase_id)
else:
inst = Purchase()
if request.method == 'POST':
form = PurchaseModelForm(request.POST or None, request.FILES, prefix='purchase', instance=inst)
formset = DetailFormSet(request.POST or None, request.FILES, prefix='detail')
form_valid = form.is_valid()
if form_valid:
purchase = form.save()
formset.save(commit=False)
for f in formset:
f.compra = purchase
f.save()
return redirect('...')
else:
form = PurchaseModelForm(prefix='purchase',instance=inst)
formset = DetailFormSet(prefix='purchase')
context = { 'form': form, 'formset': formset }
return render(request, template, context )
This is the template
<form method='POST' action="">
{% csrf_token %}
<div>
<h5 style="font-weight: bold;">Datos de la Compra</h5>
{% crispy form form.helper %}<hr/>
<h5 style="font-weight: bold;">Detalle de la Compra <a class="btn btn-rounded btn-sm btn-icon btn-default add-new-form"><i class="fa fa-plus text-success"></i></a></h5>
</div>
{{ formset.management_form|crispy }}
{% for x in formset %}
<div class="form-inline">
{{ x|crispy }}
<hr>
</div>
{% endfor %}
<div class="form-inline" id="empty-row">
{{ formset.empty_form|crispy }}
<hr>
</div>
<button class="btn btn-block btn-primary" >Guardar</button>
</form>
And the traceback is : Traceback:
File "/Users/jlattus/Dev/italuzbi/lib/python3.5/site-packages/django/core/handlers/exception.py" in inner 41. response = get_response(request)
File "/Users/jlattus/Dev/italuzbi/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response 187. response = self.process_exception_by_middleware(e, request)
File "/Users/jlattus/Dev/italuzbi/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response 185. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/jlattus/Dev/italuzbi/lib/python3.5/site-packages/django/contrib/auth/decorators.py" in _wrapped_view 23. return view_func(request, *args, **kwargs)
File "/Users/jlattus/Dev/italuzbi/src/erp/views.py" in purchase_new 415. formset.save(commit=False)
File "/Users/jlattus/Dev/italuzbi/lib/python3.5/site-packages/django/forms/models.py" in save 666. return self.save_existing_objects(commit) + self.save_new_objects(commit)
File "/Users/jlattus/Dev/italuzbi/lib/python3.5/site-packages/django/forms/models.py" in save_existing_objects 768. if not self.initial_forms:
File "/Users/jlattus/Dev/italuzbi/lib/python3.5/site-packages/django/forms/formsets.py" in initial_forms 189. return self.forms[:self.initial_form_count()]
File "/Users/jlattus/Dev/italuzbi/lib/python3.5/site-packages/django/utils/functional.py" in get 35. res = instance.dict[self.name] = self.func(instance)
File "/Users/jlattus/Dev/italuzbi/lib/python3.5/site-packages/django/forms/formsets.py" in forms 144. for i in range(self.total_form_count())]
File "/Users/jlattus/Dev/italuzbi/lib/python3.5/site-packages/django/forms/formsets.py" in total_form_count 116. return min(self.management_form.cleaned_data[TOTAL_FORM_COUNT], self.absolute_max)
File "/Users/jlattus/Dev/italuzbi/lib/python3.5/site-packages/django/utils/functional.py" in get 35. res = instance.dict[self.name] = self.func(instance)
File "/Users/jlattus/Dev/italuzbi/lib/python3.5/site-packages/django/forms/formsets.py" in management_form 98. code='missing_management_form',
Exception Type: ValidationError at /compra/new/ Exception Value: ['Los datos de ManagementForm faltan o han sido manipulados