Django报错'WSGIRequest' object has no attribute 'file_uploaded'求助
问题解决
错误根因
'WSGIRequest' object has no attribute 'file_uploaded'报错的核心原因是你错误地假设request对象会携带你刚创建的File模型实例:request仅存储用户发起请求的原生数据(比如请求头、POST参数、上传的文件流等),并不会自动生成你业务逻辑中创建的模型实例属性。
此外你的赋值逻辑也不符合Django外键关联规则:Dataset的file_uploaded字段是关联File模型的一对一外键,直接传入File模型实例即可,不需要额外加.file后缀。
修改方案
你调用form.save()时会返回刚创建入库的File模型实例,用变量接住该实例后直接传入Dataset创建语句即可,修改后的视图核心代码如下:
def file_upload(request): data = None if request.method == 'POST': form = FileForm(request.POST, request.FILES) if form.is_valid(): form.instance.user = request.user.profile # 接住form.save()返回的刚创建的File模型实例 new_file = form.save() data = request.FILES['file_upload'] data = pd.read_csv(data, header=0, encoding="UTF-8") Dataset.objects.create( user = request.user.profile, # 直接传入File实例完成关联 file_uploaded = new_file, name_user_A = data.iloc[0,1], name_user_B = data.iloc[1,1], # 其余字段保持不变 [...] ) return redirect('upload_file') else: return redirect('home') else: form = FileForm() context = { 'data': data, 'form': form, } return render(request, 'upload_file.html', context)
可选优化
如果你的FileForm是基于File模型生成的ModelForm,且表单字段已经包含file_upload,那么你不需要手动给filename赋值,可以直接在File模型的save方法中自动完成文件名赋值,精简视图代码。
内容的提问来源于stack exchange,提问作者Pisa Ponente
相关产品推荐
相关产品推荐

