【问题标题】:Django Edit Form Data: data is duplicated instead of being updatedDjango 编辑表单数据:数据被复制而不是被更新
【发布时间】: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 ) ) 

【问题讨论】:

    标签: django forms django-views


    【解决方案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】:

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

    【讨论】:

      猜你喜欢
      • 2023-02-04
      • 1970-01-01
      • 2017-08-01
      • 2022-01-07
      • 2021-10-07
      • 2014-08-03
      • 2019-02-26
      • 2019-12-02
      • 1970-01-01
      相关资源
      最近更新 更多