gpt4 book ai didi

python - Django CharFIeld with unique=True 更新错误 "Instance with this Name already exists"

转载 作者:行者123 更新时间:2023-12-04 13:14:14 26 4
gpt4 key购买 nike

我正在为客户构建一个 Django 项目,该项目要求我不使用简单的 form.save() 方法来更新模型字段。

基本上,它看起来像这样:

我有一个带有 CharField 的模型,它有 unique=True:

# models.py

class Course(models.Model):
name = models.CharField(max_length=20, unique=True)
other_field = models.CharField(max_length=10, null=True)

def __str__(self):
return self.name

该模型在 forms.py 中有一个表单:

# forms.py

class CourseCreateForm(forms.ModelForm):
class Meta:
model = Course
fields = ['name', 'other_field']

我需要通过函数 View 更新这个字段(在这种情况下不能基于类。当然,从字面上看可以,但对于我学生的项目要求,它不能)而且我不能使用简单的 form.save() 函数,所以我需要像处理普通表单一样执行完整的更新代码:

# views.py

def course_update(request, pk):
course = Course.objects.get(pk=pk)
course_queryset = Course.objects.filter(pk=pk)


if request.method == "POST":
form = CourseCreateForm(request.POST)
if form.is_valid():
name = form.cleaned_data['name']
other_field = form.cleaned_data['other_field']
course_queryset.update(name=name, other_field=other_field) # <-- Where I try to update
else:
print(form.errors)
return HttpResponseRedirect('../')
else:
form = CourseCreateForm(instance=course)

context = {
"form": form,
}

return render(request, 'base/course_update.html', context)

当我尝试只更新 other_field 时,没有进行更改,并且在以前的错误中我收到错误“具有此名称的类(class)已经存在。”,所以我不能只更改other_field 数据,而不必更改 name 字段,因为 name 字段是唯一的。

如何在不更改唯一值的情况下更新具有 unique=True 的模型实例的字段?

希望这是有道理的!

谢谢。

更新:

还想补充一点,当 unique=True 关闭时它工作得很好。我很好奇当 unique=True 并且您从模型表单添加相同的变量时,您如何正常更新字段。

最佳答案

这将失败的原因是因为 ModelForm 认为您正在创建一个 记录,因此它将检查具有给定名称的对象是否已经存在,如果是这样,它当然会发现该名称已经存在,因此该表单无效。

您可以将实例 传递给表单。在这种情况下,表单将从唯一检查中排除该项目:

def course_update(request, pk):
course = Course.objects.get(pk=pk)
course_queryset = Course.objects.filter(pk=pk)
if request.method == 'POST':
form = CourseCreateForm(request.POST<b>, instance=course</b>)
if form.is_valid():
name = name_form.cleaned_data['name']
other_field = course_form.cleaned_data['other_field']
course_queryset.update(name=name, other_field=other_field)
return HttpResponseRedirect('../')
else:
print(form.errors)
else:
form = CourseCreateForm(instance=course)
context = {
'name_form': name_form,
'course_form': course_form,
}
return render(request, 'base/course_update.html', context)

关于python - Django CharFIeld with unique=True 更新错误 "Instance with this Name already exists",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61954177/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com