Django Formset提交报错:'ColumnFormFormSet'无save属性如何解决?
解决Django Formset提交时抛出'... object has no attribute 'save''的错误
问题根源
用formset_factory创建的普通表单集没有内置save()方法,只有基于ModelForm的ModelFormSet(通过modelformset_factory生成)才支持直接调用save()批量保存数据。
推荐解决方案:改用modelformset_factory
替换原有表单集创建方式,使用专门为ModelForm设计的modelformset_factory,它自带批量保存功能。
修改后的views.py代码
from .forms import ColumnForm from django.forms import modelformset_factory from django.shortcuts import redirect, render from .models import Column # 需导入Column模型 def design(request): # 用modelformset_factory创建表单集,指定关联模型、表单类和额外字段数 ColumnFormSet = modelformset_factory(Column, form=ColumnForm, extra=30) if request.method == 'POST': formset = ColumnFormSet(request.POST) if formset.is_valid(): formset.save() # 现在可正常调用save()批量保存 return redirect('Home') else: # 传入空queryset,避免默认显示数据库中已有的Column记录 formset = ColumnFormSet(queryset=Column.objects.none()) return render(request, 'design.html', {'formset': formset})
关键说明
modelformset_factory必须指定对应的模型(Column)和使用的表单类(ColumnForm)- 添加
queryset=Column.objects.none()后,表单集默认只显示30个空表单,不会加载数据库中已有的数据
备选方案:手动遍历表单保存
若坚持使用普通formset_factory,可遍历表单集中的每个有效表单,逐个保存:
修改views.py的POST处理逻辑
from .forms import ColumnForm from django.forms import formset_factory from django.shortcuts import redirect, render def design(request): ColumnFormSet = formset_factory(ColumnForm, extra=30) if request.method == 'POST': formset = ColumnFormSet(request.POST) if formset.is_valid(): # 遍历表单,跳过空表单后逐个保存 for form in formset: if form.cleaned_data: form.save() return redirect('Home') else: formset = ColumnFormSet() return render(request, 'design.html', {'formset': formset})
额外修正点
- 代码中导入语句的
From需改为小写from,否则会触发语法错误 - 模板
design.html中,表单结束标签需改为</form>,而非<form/>
内容的提问来源于stack exchange,提问作者user21388606
相关产品推荐
相关产品推荐

