ColumnFormFormSet objects has no attribute ‘save’

Question:

I want to create 30 fields in the design.html, after I successfully added that using django formset When I try to submit the form instead of saving the field to the database, it throws me an error saying 'ColumnFormFormSet' object has no attribute 'save' how can I solve this problem?

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)

Forms.py:

from django import forms
from .models import Column

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

views.py:

From .forms import ColumnForm
From django.forms import formset_factory

def design(request):
    ColumnFormSet = formset_factory(ColumnForm, 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})

template.design.html:

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

||

Answers:

You cannot call save() on a regular Formset, you probably want to be using a ModelFormset instead.

Replacing the formset_factory import in your views.py with modelformset_factory should do the trick.

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: Ben Foltz
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.