Django 编辑表单数据:数据被复制而不是被更新

Posted

技术标签:

【中文标题】Django 编辑表单数据:数据被复制而不是被更新【英文标题】:Django Edit Form Data: data is duplicated instead of being updated 【发布时间】:2011-05-08 21:24:39 【问题描述】:

如何更新现有记录而不是添加新记录,这是我的问题。现在我正在尝试在编辑表单中编辑现有产品数据并保存新的更改。但是,我没有更新现有的产品数据,而是得到了一个新产品,所以一切都被复制了。创建新产品,而不是更新其现有数据。我该怎么做才能解决这个问题?

这是我的代码:

@login_required
def edit(request, id=None):
if request.method == 'POST':
    form = ProductForm(request.POST)

    if form.is_valid():
        product = form.save( commit=False )
        product.save()

        return HttpResponseRedirect( '/details/%s/' % ( product.id ) ) 

Eternicode,感谢您的出色回答,代码现在可以正常工作并且数据不会重复,因为我在编辑日期后保存表单。根据您的回复,以下是可行的:

@login_required
def edit(request, id=None):

if request.method == 'POST':
    product = Product.objects.get(id__exact=id)
    form = ProductForm(request.POST, instance=product)

    print "PRODUCT POST"

    if form.is_valid():
        print "Display Form"

        product = form.save( commit=False )
        product.save()

        return HttpResponseRedirect( '/details/%s/' % ( product.id ) ) 

【问题讨论】:

【参考方案1】:

为了更新现有对象,您必须将该对象作为instance kwarg 提供给您的表单。来自the docs:

>>> from django.forms import ModelForm

# Create the form class.
>>> class ArticleForm(ModelForm):
...     class Meta:
...         model = Article

# Creating a form to add an article.
>>> form = ArticleForm()

# Creating a form to change an existing article.
>>> article = Article.objects.get(pk=1)
>>> form = ArticleForm(instance=article)

【讨论】:

成功了!太感谢了。表单中的数据现在已被编辑、保存且不会被复制。另外,我在 Django 文档中发现 pk 暗示 id__exact 所以我使用 id__exact 而不是 pk。不知何故 pk 给了我错误。只是想在我的第二条评论中向您展示我的代码,再次感谢您! @login_required def edit(request, id=None): #if id: if request.method == 'POST': product = Product.objects.get(id__exact=id) form = ProductForm( request.POST, instance=product) print "PRODUCT POST" if form.is_valid(): print "Display Form" product = form.save(commit=False) product.save() return HttpResponseRedirect('/details/%s/ ' % (product.id)) @Sophie,如果您想展示有效的代码,那很好,但作为您问题的附录可能会更好。另外,不要忘记“接受”解决您问题的答案:) 可以添加部分保存吗?【参考方案2】:

您从未检索到您尝试更新的原始对象。你需要先这样做!

【讨论】:

以上是关于Django 编辑表单数据:数据被复制而不是被更新的主要内容,如果未能解决你的问题,请参考以下文章

单击并在数据库中更新时在 Django 中编辑表单字段

如何在不更新表单中所有字段的情况下进行更新

Django 模型窗体

Django 编辑用户配置文件

保存时复制数据库中的数据(Django 表单)

Django 表单向导备份和恢复