Django表单报错:Field 'transaction' 期望数值却得到BoundField对象
报错原因
Django表单实例通过project_form[字段名]的方式取到的是BoundField类型的表单控件对象,不是经过表单验证转换后的实际有效值。你把这个控件对象直接赋值给了Project模型的数值类型transaction字段,类型不匹配就触发了该报错。
表单验证通过(即is_valid()返回True)后,所有经过校验、类型转换后的合法输入值都会存储在表单的cleaned_data字典中,你需要从这个字典里取实际值给模型字段赋值。
可行解决方案
方案1:手动从cleaned_data取值
将视图中给项目字段赋值的3行代码修改为从cleaned_data取值即可:
project.title = project_form.cleaned_data['title'] project.business_partner = project_form.cleaned_data['business_partner'] project.transaction = project_form.cleaned_data['transaction']
方案2:使用ModelForm原生更新逻辑(更推荐)
你用的是ModelForm,本身就支持更新已有模型实例,不需要手动逐个字段赋值,代码更简洁也不容易出错,修改视图代码如下:
def uploadpdf(request,pk): project = Project.objects.get(id=pk) # 初始化表单时传入instance参数,指定要更新的已有项目实例 project_form = ProjectForm(request.POST, instance=project) if project_form.is_valid() and request.FILES: project_form.instance.user = request.user # 调用save方法直接完成实例更新,无需手动赋值字段 project = project_form.save() # 后续的PDF文件处理逻辑保持原有代码不变即可 file_path = None for file in request.FILES: file = request.FILES[file] pdf_file = PDFFile(file=file, filename=file.name) pdf_file.project = project pdf_file.save() if PRODUCTION: file_path = HOST_NAME +'/'+ str(pdf_file.file) else: file_path = HOST_NAME +'/media/'+ str(pdf_file.file) resp = HttpResponse(f'{{"message": "Uploaded successfully...", "id": "{project.id}","url":"{file_path}","title": "{project.title}"}}') resp.status_code = 200 resp.content_type = "application/json" return resp else: return reverse("dashboard:homepage")
内容的提问来源于stack exchange,提问作者Masaki93
相关产品推荐
相关产品推荐

