为啥我的表单创建一个新的模型对象而不是修改一个?
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 这不是问题以上是关于为啥我的表单创建一个新的模型对象而不是修改一个?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 SwiftUI 列表填充相同的项目 4 次而不是全部 4 个项目?