Django报错:DeclarativeFieldsMetaclass类型参数不可迭代,求解决方案
问题解决:TypeError at /primary argument of type 'DeclarativeFieldsMetaclass' is not iterable
核心错误原因
出现该报错的关键问题有两个:
- 表单类继承错误:你使用了
forms.Form(普通表单类)却同时定义Meta类绑定模型,绑定模型的表单必须继承forms.ModelForm。 - CreateView配置错误:
CreateView的fields参数用于指定模型字段列表,你却将自定义表单类赋值给它,正确做法是用form_class参数指定自定义表单。
分步修复代码
1. 修正forms.py
将表单父类改为forms.ModelForm,同时确保字段列表与模型匹配:
from django import forms from .models import Primary, PrimaryAlbum, Secondary, SecondaryAlbum from jsignature.forms import JSignatureField from jsignature.widgets import JSignatureWidget class PrimaryForms(forms.ModelForm): signature_of_student = JSignatureField( widget=JSignatureWidget( jsignature_attrs={'color':'#e0b642', 'height':'200px'} ) ) class Meta: model = Primary fields = ['admission_number', 'profile_picture', 'first_name', 'last_name', 'gender', 'address_of_student', 'class_Of_student', 'signature_of_student', 'year_of_graduation'] # 注意:如果Primary模型包含year_of_graduation字段,必须加到fields列表中,否则后续get_form会报错
2. 修正views.py
将fields = PrimaryForms替换为form_class = PrimaryForms:
from .forms import PrimaryForms class CreatePrimaryStudent(LoginRequiredMixin, CreateView): model = Primary form_class = PrimaryForms # 此处修改 template_name = 'create_primary_student_information.html' success_url = reverse_lazy('Home') def get_form(self, form_class=None): form = super().get_form(form_class) # 确认Primary模型存在year_of_graduation字段,否则删除该行操作 form.fields['year_of_graduation'].queryset = PrimaryAlbum.objects.filter(user=self.request.user) return form def form_valid(self, form): form.instance.user = self.request.user return super(CreatePrimaryStudent, self).form_valid(form)
额外检查项
- 确认
Primary模型包含year_of_graduation字段,若不存在则要么在模型中添加该字段,要么删除get_form中对该字段的查询集配置。 - 确保
fields列表中的所有字段都存在于Primary模型中,避免出现字段不存在的报错。
内容的提问来源于stack exchange,提问作者Adamu Abdulkarim Dee
相关产品推荐
相关产品推荐

