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的错误。你其他视图没问题,肯定是那些视图里你直接引用了表单类,没加引号对吧?
修复步骤
- 先确保表单类已正确导入:在你的
views.py顶部,确认已经导入了Testform:from .forms import Testform # 假设你的表单定义在forms.py里 - 修正
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
相关产品推荐
相关产品推荐

