Django CreateView指定自定义ModelForm报错,求正确实现方法
Django CreateView 正确使用自定义ModelForm的方法
错误原因
你把form_class赋值成了表单实例(AssessmentForm()),但Django类视图要求这个字段指向表单类本身,而非已经实例化的对象,这才导致了"TypeError 'AssessmentForm' object is not callable"错误。
正确实现步骤
1. 确保自定义ModelForm定义正确(forms.py)
先在forms.py中完成带CSS类和自定义标签的ModelForm编写:
from django import forms from .models import Assessment class AssessmentForm(forms.ModelForm): class Meta: model = Assessment # 指定需要渲染的字段 fields = ['title', 'content', 'score'] # 给字段添加CSS类 widgets = { 'title': forms.TextInput(attrs={'class': 'form-control'}), 'content': forms.Textarea(attrs={'class': 'form-control', 'rows': 5}), 'score': forms.NumberInput(attrs={'class': 'form-control'}), } # 自定义字段显示标签 labels = { 'title': '评估标题', 'content': '评估详情', 'score': '最终评分', }
2. 在CreateView中绑定表单类(views.py)
直接将form_class指向表单类本身,不要加括号实例化:
from django.views.generic.edit import CreateView from .models import Assessment from .forms import AssessmentForm class AssessmentCreateView(CreateView): model = Assessment form_class = AssessmentForm # 这里直接使用类,而非实例 success_url = '/assessments/' # 提交成功后的跳转地址,也可使用reverse_lazy实现反向解析
3. 模板中渲染表单
在对应的模板文件里,直接渲染表单即可自动应用你定义的CSS类和标签:
<form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit" class="btn btn-primary">提交评估</button> </form>
额外注意事项
- 若需要动态调整表单(比如根据当前用户权限隐藏/显示字段),不要直接修改
form_class,而是重写视图的get_form()方法来实现。 - 不要手动实例化表单类赋值给
form_class,Django会在视图处理流程中自动完成表单实例化。
内容的提问来源于stack exchange,提问作者nickj_french
相关产品推荐
相关产品推荐

