Django跳转packing路径报Photo数据验证失败错误如何修复
错误原因及修复方案
核心错误点
- 路由参数不匹配:urls.py中定义的路径参数是
pk,但视图函数packing接收的参数名是id,参数不匹配会导致视图无法正常获取ID值。 - 保存了未验证的表单:当
pickingform验证通过后,代码错误调用了form.save()而非pickingform.save(),此时packing表单未经过验证,直接保存就会抛出数据未验证无法修改Photo的错误。 - 比较逻辑错误:
if form != photo.packing:的写法完全错误,form是表单类实例,photo.packing是模型字段值,二者无法直接比较;同时picking判断部分错误地和photo.packing比较,应该和photo.picking比较。 - 手动修改的字段未保存:代码中修改了
photo.status和photo.Datetime两个字段值,但直接调用form.save()只会保存表单定义的packing/picking字段,手动修改的属性不会被同步到数据库。
修正后的代码
1. urls.py 修正参数匹配
path('packing/<str:id>', views.packing, name='packing'),
2. views.py 修正逻辑错误
@login_required() def packing(request, id): photo = get_object_or_404(Photo, id=id) if request.method == "POST": form = packingForm(request.POST, instance=photo) pickingform = pickingForm(request.POST, instance=photo) if form.is_valid(): # 校验数值变化 if form.cleaned_data['packing'] != photo.packing: # 先获取实例不提交到库,修改自定义字段后再保存 photo = form.save(commit=False) photo.status = 'Packing' photo.Datetime = datetime.now() photo.save() return redirect('gallery') elif pickingform.is_valid(): if pickingform.cleaned_data['picking'] != photo.picking: photo = pickingform.save(commit=False) photo.status = 'Picking' photo.Datetime = datetime.now() photo.save() return redirect('gallery') else: form = packingForm(instance=photo) pickingform = pickingForm(instance=photo) context = { "form": form, "pickingform": pickingform, "photo": photo } return render(request, 'packing.html', context)
3. forms.py 可选清理冗余代码
pickingForm中字段定义required=True和__init__中修改为required=False的冗余配置可以根据业务需求清理,不影响功能运行。
内容的提问来源于stack exchange,提问作者Rainysky
相关产品推荐
相关产品推荐

