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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:45:07