使用Django modelformset报错:ModelFormOptions无private_fields属性
问题解决:ModelFormOptions' object has no attribute 'private_fields'
错误原因
调用modelformset_factory时参数传错了——第一个参数必须是Django模型类,而非已定义的ModelForm类。你传入了ColumnForm(ModelForm实例),导致内部元数据处理逻辑混乱,触发了该错误。
修复方案
方案1:直接基于模型生成表单集(无需自定义ModelForm时使用)
修改视图代码,将modelformset_factory的第一个参数替换为模型Column,并指定所需字段:
from .models import Column from django.forms import modelformset_factory from django.shortcuts import redirect, render def design(request): # 第一个参数为模型Column,指定字段和额外表单数量 ColumnFormSet = modelformset_factory(Column, fields=('name', 'selec_type'), extra=30) 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})
方案2:复用自定义的ColumnForm(需要自定义表单逻辑时使用)
如果要保留你编写的ColumnForm(比如后续添加验证规则或自定义字段),则通过form参数指定自定义表单,第一个参数仍为模型Column:
from .forms import ColumnForm from .models import Column from django.forms import modelformset_factory from django.shortcuts import redirect, render def design(request): # 第一个参数为模型Column,form参数指定自定义的ColumnForm ColumnFormSet = modelformset_factory(Column, form=ColumnForm, extra=30) 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})
额外优化
模板中的表单闭合标签有误,将<form/>改为</form>,避免渲染异常:
<form method='post'> {% csrf_token %} {{ formset.management_form}} {% for form in formset %} {{form.as_p}} {% endfor %} <button type='submit'>Save</button> </form>
内容的提问来源于stack exchange,提问作者user21388606
相关产品推荐
相关产品推荐

