You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 00:54:18