0

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

jplattus
  • 281
  • 3
  • 11

0 Answers0