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)
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})
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)
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})