model form set throws an error: ModelFormOptions' object has no attribute 'private_fields'

Question:

I’m trying to create 30 fields in one model that has only 2 fields, I know it can be done using formset but that one doesn’t support save() method when submitted the form, so I changed it to: modelformset that supported save() method, but using modelformset throws me an error in the design.html saying: ModelFormOptions' object has no attribute 'private_fields' how can I solve this problem?

from .forms import ColumnForm
from django.forms import modelformset_factory

def design(request):
    ColumnFormSet = modelformset_factory(ColumnForm, fields = ('name', 'selec_type'), extra=30)
    formset = ColumnFormSet
    if request.method == 'POST':
        formset = ColumnFormSet(request.POST)
        if formset.is_valid():
            formset.save()
            return redirect('Home')
    else:
        formset = ColumnFormSet()
    return render (request, 'design.html', {'formset':formset})

forms.py:

from django import forms
from .models import Column

class ColumnForm(forms.ModelForm):
    class Meta:
        model = Column
        fields = ['name', 'selec_type']

template:

<form method='post'>
    {% csrf_token %}
{{ formset.management_form}}
   {% for form in formset %}
        {{form.as_p}}
   {% endfor %}
<button type='submit'>Save<button/>
<form/>

Models.py:

class Type(models.Model):
    TYPE_OF_DATA = (
        ('Number', 'Number'),
        ('character', 'character'),
        ('check_box', 'check_box'),
        ('date', 'date'),
        ('image', 'image'),
             )
    data_type = models.CharField(max_length=1000, choices= TYPE_OF_DATA)

class Column(models.Model):
     name = models.CharField(max_length=100)
     selec_type = models.ForeignKey(Type, on_delete=CASCADE)
Asked By: Ganyen

||

Answers:

Modelfromset doesn’t support form class that are in my forms.py file:

So, I changed my views from this:

   ColumnFormSet = modelformset_factory(ColumnForm, fields = ('name', 'selec_type'), extra=30)

To this:

   ColumnFormSet = modelformset_factory(Column, fields = ('name', 'selec_type'), extra=30)
from .forms import ColumnForm
from django.forms import modelformset_factory

def design(request):
    ColumnFormSet = modelformset_factory(Column, fields = ('name', 'selec_type'), extra=30)
    formset = ColumnFormSet
    if request.method == 'POST':
        formset = ColumnFormSet(request.POST)
        if formset.is_valid():
            formset.save()
            return redirect('Home')
    else:
        formset = ColumnFormSet()
    return render (request, 'design.html', {'formset':formset})
Answered By: Ganyen