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 编辑表单数据:数据被复制而不是被更新的主要内容,如果未能解决你的问题,请参考以下文章