gpt4 book ai didi

django - 使用 ModelForm 编辑模型实例会创建新实例而不是更新

转载 作者:行者123 更新时间:2023-12-02 09:57:48 25 4
gpt4 key购买 nike

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

注意:EventForm 是 ModelForm

我尝试使用 https://docs.djangoproject.com/en/dev/ref/models/instances/#forcing-an-insert-or-update 的force_update arg ,但没有骰子。我还尝试过删除 form.is_valid() block 中的原始事件(通过调用 event.delete()),但是......没有骰子。

我感觉 commit=False 是问题所在?我不确定!

谢谢。

(请忽略代码片段中的空格问题)

def edit_event(request, event_id):
event = Event.objects.get(pk=event_id)

if request.method == 'POST':
post_data = request.POST.copy()

# here is some validation that can't be done in the ModelForm...

#form = EventForm(post_data, request.FILES, instance=event)
form = EventForm(post_data, request.FILES)

if form.is_valid():

edited_event = form.save(commit=False)

edited_event.save(force_update=True) # doesn't work with or without force_update arg

#form.save_m2m() # needed for ManyToMany relationship

return HttpResponseRedirect('/events/view/%s' % edited_event.id)
else:
form = EventForm(instance=event)

return render_to_response('create_event.html', {'form': form,}, context_instance=RequestContext(request) )

更新

我摆脱了模型上的 M2M 关系,因此我能够摆脱 form.save_m2m() 行。那还是不行。

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

在更新模型时我是否遗漏了重要细节?

最佳答案

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

form = EventForm(post_data, request.FILES, instance=event)

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

关于django - 使用 ModelForm 编辑模型实例会创建新实例而不是更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6159688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com