【问题标题】:Django CharFIeld with unique=True update error "Instance with this Name already exists"具有唯一性的 Django CharFIeld = True 更新错误“具有此名称的实例已存在”
【发布时间】:2020-05-22 11:39:31
【问题描述】:

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

基本上是这样的:

我有这个模型,CharFieldunique=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']

我需要通过函数视图来更新这个字段(在这种情况下不能基于类。当然,字面上可以,但是对于我学生的项目要求不能),我不能使用简单的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 时,没有进行更改,并且在表单错误中我收到错误“具有此名称的课程已经存在。”,所以我不能只更改 other_field 数据也不必更改 name 字段,因为 name 字段是唯一的。

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

希望这是有道理的!

谢谢。

更新:

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

【问题讨论】:

  • "我不能使用简单的 form.save() 函数" 为什么不呢?
  • 这是我正在帮助的一个学生项目。基本上,我必须向她展示保存模型实例时的样子,因为她必须通过 Model.objects.raw('') 函数将其转换为原始 sql 查询。绝对是一个独特的情况哈哈。

标签: python django django-models django-forms


【解决方案1】:

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

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

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, instance=course)
        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)

【讨论】:

  • 谢谢!像魅力一样工作。更有意义的是,这是因为 ModelForm。如果它是常规形式,它会工作吗?
猜你喜欢
  • 2019-07-08
  • 2018-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-13
  • 2014-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多