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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:24:03