Django出现'NoneType'无user属性及Dataset查询不存在报错如何修复
Django问题修复方案
问题1(Admin后台Dataset报错'NoneType' object has no attribute 'user')修复
原因
- 创建Dataset实例时未填充必填外键字段
user和file_uploaded,导致字段为空,访问时触发属性错误 - File模型的
__str__方法未做非空判断,若关联的user为空也会触发该错误
修复代码
- 首先修改File模型的
__str__方法,增加空值兼容:
class File(models.Model): # 原有字段保持不变 def __str__(self): return f"{self.user.name if self.user else '未知用户'}的文件"
- 修改上传视图的Dataset创建逻辑,补全必填字段,删除无效代码:
def file_upload(request): data = None if request.method == 'POST': form = FileForm(request.POST, request.FILES) raw_file= request.FILES if form.is_valid(): form.instance.user = request.user.profile form.instance.filename = raw_file['file_upload'].name # 接住保存后的File实例,用于关联Dataset file_obj = form.save() data = request.FILES['file_upload'] data = pd.read_csv(data, header=0, encoding="UTF-8") # 移除无效代码:data_form.instance.user = request.user.profile(data_form未定义) # 创建Dataset时补全user和file_uploaded字段 Dataset.objects.create( user = request.user.profile, file_uploaded = file_obj, 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)
问题2(结果页报错Dataset matching query does not exist)修复
原因
- 之前创建Dataset时未关联对应的File实例,通过File反向查询Dataset时找不到对应记录
- 原结果视图仅查询File对象,未处理关联Dataset不存在的情况
修复代码
修改结果视图,增加404兼容,直接关联查询Dataset:
from django.shortcuts import get_object_or_404 def results(request, id): # 先获取当前用户对应的File实例,不存在直接返回404 file_obj = get_object_or_404(File, user=request.user.profile, pk=id) # 关联查询Dataset(前面上传逻辑已经保证每个File都有对应的Dataset) dataset = file_obj.dataset context = { 'file': file_obj, 'dataset': dataset } return render(request, 'results.html', context)
如果你的模板里之前用results变量调用属性,对应修改模板里的变量名为dataset即可。
内容的提问来源于stack exchange,提问作者Pisa Ponente
相关产品推荐
相关产品推荐

