为啥我的表单创建一个新的模型对象而不是修改一个?

Posted

技术标签:

【中文标题】为啥我的表单创建一个新的模型对象而不是修改一个?【英文标题】:Why is my form creating a new model object instead of modifying one?为什么我的表单创建一个新的模型对象而不是修改一个? 【发布时间】:2018-03-22 13:55:05 【问题描述】:

我正在开发一个允许用户修改现有模型对象的 Django 视图。但是,当提交表单时,它会创建一个新对象,而不是修改现有对象。

我已阅读有关 save() 函数、表单、查询等的 Django 文档,但无法理解发生了什么。文档说 .save() 应该在数据库端转换为 UPDATE 语句。

我认为问题与此模型的主键有关。我没有手动定义一个。该表单似乎没有拉入 Django 自动创建的 ID 字段。由于该 ID 没有传递给 .save(),因此它认为我想要一个新对象(因为没有指定 pk)。

def modify(request, auditID):
    this_audit = get_object_or_404(Audit, id=auditID)

    form = auditForm(instance=this_audit)

    if form.is_valid():
        form.save()

    return redirect('index')

还有模特:

from django.db import models


class Audit(models.Model):
    Inactive = '0'
    Completed = '1'
    InProgress = '2'
    Waiting = '3'

    status_choices = (
        (Inactive, "This audit is inactive. It may have been cancelled or    entered by mistake."),
        (Completed, "This audit is completed."),
        (InProgress, "This audit is currently in progress."),
        (Waiting, "This audit is waiting to be started."),
        )

    project_number = models.CharField(max_length=10, help_text="This is the audit project number. It should be in the format <b>A-xxx-xxx</b>.")
    title = models.CharField(max_length=300, help_text="This is the full audit title.")
    title_short = models.CharField(max_length=100, help_text="This is a short title that will be displayed when the long title is inconvenient.")
    status = models.CharField(max_length=1, choices = status_choices, default= Waiting, help_text="This is the current status of the audit.")

    def __str__(self):
        return self.title_short

【问题讨论】:

请发布您的模型。你有自定义主键吗?一般不需要单独设置字段,而是使用form.save() 为什么不实际验证表单中的数据? @Selcuk - 我已经添加了模型。最初我确实使用了 form.save(),但将其替换为我的故障排除的一部分。我想也许我误解了 form.save() 的工作原理。 【参考方案1】:

这样会更好,是更好的做法

def modify(request, auditID):
    this_audit = get_object_or_404(Audit, id=auditID)

    form = auditForm(request.POST, instance=this_audit)

    if form.has_changed():
        if form.is_valid():
            form.save()

    return redirect('index')

引用 https://docs.djangoproject.com/en/1.11/topics/forms/modelforms/#the-save-method 。我不确定,但基本上问题是你必须使用request.POST

【讨论】:

谢谢。我在问题中编辑了更多信息。我认为问题源于使用 Django 的自动 ID 字段,而不是为模型创建新的主键。 @indigochild 这不是问题

以上是关于为啥我的表单创建一个新的模型对象而不是修改一个?的主要内容,如果未能解决你的问题,请参考以下文章

Django 内联表单集将始终创建新对象而不是更新它们

为啥我的 SwiftUI 列表填充相同的项目 4 次而不是全部 4 个项目?

CoreData - 更新模型类而不是创建新的

为啥我的 Django 工厂函数在本地数据库中创建模型,而不是测试数据库?

Django:如何显示内联表单集中每个模型对象的表单错误

如何修复局部视图的视图模型