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

Django中FormView报TypeError: 'str' object is not callable错误求助

兄弟,我一眼就揪出问题所在了——你在Test视图里犯了一个很容易忽略的小错误:把form_class赋值成了字符串"Testform",而不是实际的表单类本身!

错误原因

Django的FormView要求form_class必须是一个可调用的表单类(比如你定义的Testform这个ModelForm或者Form子类),但你现在给的是字符串类型的值。当Django尝试调用这个字符串来生成表单实例时,自然就会抛出'str' object is not callable的错误。你其他视图没问题,肯定是那些视图里你直接引用了表单类,没加引号对吧?

修复步骤

  1. 先确保表单类已正确导入:在你的views.py顶部,确认已经导入了Testform:
    from .forms import Testform  # 假设你的表单定义在forms.py里
    
  2. 修正form_class的赋值:把引号去掉,直接引用类:
    form_class = Testform  # 去掉引号!
    

修正后的完整视图代码

class Test(FormView):
    template_name = "pkm_templates/main.html"
    form_class = Testform  # 这里已经修正
    success_url = '/thanks/'

    def form_valid(self, form):
        title = form.cleaned_data.get("title")
        fkey = form.cleaned_data.get("fkey")
        # 如果fkey是ManyToMany字段,不要在create时直接赋值
        instance = Buildkb.objects.create(title=title)
        # 注意:如果fkey是单个ForeignKey对象,这里的循环会报错,要先判断类型
        if hasattr(fkey, '__iter__') and not isinstance(fkey, str):
            for user in fkey:
                instance.fkey.add(user)
        else:
            # 如果是单个对象,直接赋值
            instance.fkey = fkey
        instance.save()
        return redirect("/")

额外注意点

  • 我注意到你在处理fkey的时候用了循环,如果fkey是模型的ForeignKey字段(一对一关联),那form.cleaned_data.get("fkey")返回的是单个对象,循环会报错,这时候你直接赋值instance.fkey = fkey就行,不用循环。
  • 如果fkey是ManyToManyField,那在创建Buildkb实例时不要在create()里传fkey=fkey,因为ManyToMany关联需要实例创建后才能添加,你的原代码里后面又用add(),其实前面的fkey=fkey是多余的,甚至可能引发其他问题,建议去掉。

内容的提问来源于stack exchange,提问作者user9776142

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:16:55