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)这种写法的正常使用。