Django用instance实例化表单时报必填字段未填写错误如何解决
问题根因
- 你在实例化
product_prices_form时同时传入了request.POST和已有实例,Django ModelForm的规则是POST数据优先级高于instance原有值,你的前端页面仅提交了WrongPrice对应的表单字段,没有提交product_prices的其他必填字段,所以request.POST中这些字段为空,触发必填校验错误。 - 逻辑顺序错误:你在未校验
form_wrong_price合法性的前提下,就直接取它的instance值赋值给product_prices实例,属于逻辑漏洞。 - 额外注意:原代码中校验表单时用的
&是按位与运算符,此处应该用逻辑与运算符and。
修复方案
你完全不需要用product_prices_form来做校验,因为你不需要用户修改product_prices的其他字段,只需要改两个价格字段,直接操作instance保存就行,不需要走表单校验。修改后代码如下:
def wrong_price(request,pk): # 建议用get()代替filter()[0],数据不存在时直接抛404更符合常规逻辑 instance_productprice = product_prices.objects.get(id=pk) # 提取基础值 wrong_link = instance_productprice.link img_url = instance_productprice.image_url wrong_price = instance_productprice.last_price domain = instance_productprice.domain # 初始化错价上报实例 instance_wrongprice = WrongPrice( link=wrong_link, correct_price=wrong_price, domain = domain) if request.method == "POST": form_wrong_price = wrong_price_form(request.POST,instance=instance_wrongprice) # 先校验错价上报表单 if form_wrong_price.is_valid(): # 校验通过后保存错价记录 wrong_price_record = form_wrong_price.save() # 直接修改product_prices实例的两个价格字段,无需走表单校验 instance_productprice.start_price = wrong_price_record.correct_price instance_productprice.last_price = wrong_price_record.correct_price instance_productprice.save() messages.success(request, "Thanks") return redirect("my_page") else: messages.error(request, form_wrong_price.errors) return redirect("wrong-price", pk=pk) else: form_wrong_price = wrong_price_form(instance=instance_wrongprice) return render(request, "my_app/wrong_price.html",context={"form":form_wrong_price,"info":{"image_url":img_url}})
如果确实有场景需要用到product_prices_form(比如允许用户修改部分其他字段),可以在表单定义时指定fields参数仅放开需要修改的字段,或者把不需要用户修改的字段设为disabled,表单校验时就会忽略这些字段,直接复用instance的原有值。
内容的提问来源于stack exchange,提问作者CutePoison
相关产品推荐
相关产品推荐

