Django 使用ModelForm编辑模型实例将创建新实例,而不是更新

Django 使用ModelForm编辑模型实例将创建新实例,而不是更新,django,django-models,django-forms,Django,Django Models,Django Forms,我试图创建一个视图,允许用户编辑模型实例(本例中的事件)。不幸的是,提交此表单会创建一个新实例(具有新id),甚至不会删除旧实例。我的印象是save方法应该在这种情况下更新实例 注意:EventForm是一个ModelForm 我试过使用force_update arg per,但没有骰子。我还尝试过删除表单中的原始事件。是否有效()块(通过调用event.delete())但是…没有骰子 我觉得问题出在commit=False?我不确定 谢谢 (请忽略代码段中的间距问题) 更新 我去掉了模型上

我试图创建一个视图,允许用户编辑模型实例(本例中的事件)。不幸的是,提交此表单会创建一个新实例(具有新id),甚至不会删除旧实例。我的印象是save方法应该在这种情况下更新实例

注意:EventForm是一个ModelForm

我试过使用force_update arg per,但没有骰子。我还尝试过删除
表单中的原始事件。是否有效()
块(通过调用
event.delete()
)但是…没有骰子

我觉得问题出在
commit=False
?我不确定

谢谢

(请忽略代码段中的间距问题)

更新

我去掉了模型上的M2M关系,因此我可以去掉
表单。save_M2M()
行。那还是不行

我还尝试在提交表单时不传递实例,因为假设在用户提交表单时会预先填充正确的字段(现在就是这种情况)。这仍然不起作用


在更新模型时,我是否遗漏了一个重要的细节

你的例子太复杂了。尝试用简单的模型/视图/表单从头开始。使用一个简单的字段创建新模型,然后创建模型表单和视图,并确保它们正常工作。然后开始修改视图,使其更接近实际状态。

据我所知,代码的问题在于保存之前总是创建一个新实例。由于您已经在“event=event.objects.get(pk=event\u id)”中获得了事件的实例,您可以简单地更改此实例并保存它,我很确定这将导致django进行更新

我建议您查看此链接:

它对Django用来区分插入和更新的算法有一个非常简单的解释。如果您的对象没有设置主键(可能是django在syncdb时自动创建的“id”字段),那么它将被视为一个新对象。如果设置了该字段,Django将尝试在数据库中查找该特定记录,如果该记录存在,将对其进行更新


希望答案足够清楚。

我认为您应该这样初始化表单(正如您已经注释掉的那样)


然后事件对象与表单关联,并且
form.save()
可以执行更新而不是插入。

配置文件显示和更新工作代码:

@login_required(login_url=LOGIN_URL)
@csrf_exempt
def profile(request):
    """
    :param request:
    :param:
    :return:
    """
    val = get_object_or_404(Profil, user=request.user)

if request.method == 'POST':
    form = ProfilForm(request.POST, request.FILES, instance=val)
    if form.is_valid():
        form.save()
        msg_ok = u'Profil updated'
    else:
        msg_err = u"Invalid form."
else:
    form = ProfilForm(instance=val)

return render(request, "back/profile.html", locals())

? 你认为我的例子太复杂的理由是什么?在我看到的Django文档中没有任何地方说。。。
form = EventForm(post_data, request.FILES, instance=event)
@login_required(login_url=LOGIN_URL)
@csrf_exempt
def profile(request):
    """
    :param request:
    :param:
    :return:
    """
    val = get_object_or_404(Profil, user=request.user)

if request.method == 'POST':
    form = ProfilForm(request.POST, request.FILES, instance=val)
    if form.is_valid():
        form.save()
        msg_ok = u'Profil updated'
    else:
        msg_err = u"Invalid form."
else:
    form = ProfilForm(instance=val)

return render(request, "back/profile.html", locals())