Python 为什么我的表单要创建新的模型对象而不是修改模型对象?

Python 为什么我的表单要创建新的模型对象而不是修改模型对象?,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,我正在使用Django视图,它允许用户修改现有的模型对象。但是,提交表单时,它会创建一个新对象,而不是修改现有对象 我已经阅读了关于save()函数、表单、查询等的Django文档,但还不能理解发生了什么。文档说.save()应该转换为数据库端的UPDATE语句 我认为这个问题与这个模型的主键有关。我没有手动定义一个。表单似乎没有拉入Django自动创建的ID字段。由于该ID没有传递给.save(),它认为我需要一个新对象(因为没有指定pk) 模型: from django.db import

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

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

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

模型:

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
来自django.db导入模型的

类审核(models.Model):
非活动='0'
已完成='1'
InProgress='2'
等待='3'
状态_选项=(
(非活动,“此审核处于非活动状态。它可能已被取消或输入错误。”),
(已完成,“本次审计已完成”。),
(在程序中,“该审计目前正在进行中。”),
(正在等待,“此审核正在等待启动。”),
)
项目编号=models.CharField(最大长度=10,帮助文本=“这是审计项目编号,格式应为A-xxx-xxx。”)
title=models.CharField(max_length=300,help_text=“这是完整的审核标题。”)
title\u short=models.CharField(max\u length=100,help\u text=“这是一个短标题,当长标题不方便时将显示。”)
status=models.CharField(max_length=1,choices=status_choices,default=Waiting,help_text=“这是审核的当前状态”)
定义(自我):
返回self.title\u short

这会更好,是一种更好的做法

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')

参考资料。我不确定,但基本上问题是您必须使用
请求。POST

这会更好,是一种更好的做法

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')

参考资料。我不确定,但基本上问题是您必须使用
请求。POST

请发布您的型号。您有自定义主键吗?通常,您不需要单独设置字段,而是使用
form.save()
。为什么不实际验证表单中的数据?@Selcuk-我已经添加了模型。最初我确实使用了form.save(),但作为故障排除的一部分将其替换。我想我可能误解了form.save()的工作原理。请发布您的模型。您有自定义主键吗?通常,您不需要单独设置字段,而是使用
form.save()
。为什么不实际验证表单中的数据?@Selcuk-我已经添加了模型。最初我确实使用了form.save(),但作为故障排除的一部分将其替换。我想我可能误解了form.save()的工作原理。谢谢。我在问题中编辑了更多的信息。我认为问题源于使用Django的自动ID字段,而不是为模型创建新的主键。@indigochild这不是问题所在,谢谢。我在问题中编辑了更多的信息。我认为问题源于使用Django的自动ID字段,而不是为模型创建新的主键。@indigochild这不是问题所在