django form表单update报错 xxx with this yyy already exists

报错Movie with this Xpname already exists.
Movie是表名,xpname是字段名,
页面上更改movie中一条记录时,实际上没有更改xpname字段,但报这个错。
查看models.py中movie的定义,xpname字段required=True, 怀疑问题出在这里,对比django自带的admin管理后台中更新movie是没有问题。
页面上更改时通过from表单的形式进行更改,接着怀疑form这里出问题,通过日志打印发现form.is_valid()结果为False,这里执行中断了。
通过各种找,发现爆栈网上有人提过这个问题。

https://stackoverflow.com/questions/61954177/django-charfield-with-unique-true-update-error-instance-with-this-name-already
course = Course.objects.get(pk=pk)
    course_queryset = Course.objects.filter(pk=pk)
    if request.method == 'POST':
        form = CourseCreateForm(request.POST, **instance=course**)

当models.py中的class有字段required=True时,
一定要带上instance这个参数,否则表单更新就会出这个问题。
原因在于CourseCreateForm(request.POST)常规的写法,
ModelForm会理解为新增一条记录,而不是更新一条记录,即使
course.objects.filter(id=pk).update(xxx)很明确地写出了update。

这是一个django的坑,通过传入instance参数规避这个问题。
这种解决方法挺不pythonic的,明明update却报(table) xxx with this yyy(field) already exists, 让人困惑不已。
可以更出更明确的错误提示,比如告知需要添加instance参数之类的,根据这个错误提示网上找解决方案也比较快。
或者直接内部进行判断是更新还是新增,用户也不会感知到这个bug,不影响
CourseCreateForm(request.POST)这种写法的正常使用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值