如何更新Django modelform而不插入?
我的Django代码在插入新行而不是更新现有行时遇到问题。这里的许多人都曾就类似的问题寻求过帮助,但通常他们忘记了设置如何更新Django modelform而不插入?,django,modelform,updatemodel,Django,Modelform,Updatemodel,我的Django代码在插入新行而不是更新现有行时遇到问题。这里的许多人都曾就类似的问题寻求过帮助,但通常他们忘记了设置instance,如form=SomeModelForm(request.POST或None,instance=some\u model\u instance)。我似乎这样做是对的,但它仍然不能保存现有的数据 另一张海报也有同样的问题(见)。看起来给他用来解决问题的代码解决了问题,但是当他问的时候,没有人解释为什么它会起作用 查看 if form_type == "edit
instance
,如form=SomeModelForm(request.POST或None,instance=some\u model\u instance)
。我似乎这样做是对的,但它仍然不能保存现有的数据
另一张海报也有同样的问题(见)。看起来给他用来解决问题的代码解决了问题,但是当他问的时候,没有人解释为什么它会起作用
查看
if form_type == "edit_event":
# we need to load all the data based on the event_id
event_id = request.POST['event_id'] or None
event_to_edit = mapDataManager.getEvent(event_id)
if event_to_edit and mapDataManager.userCreatedEvent(request.user, event_to_edit):
# this user actually created this event
# let them edit it
event_form = EventModelForm(request.POST or None, instance=event_to_edit)
location_form = LocationModelForm(request.POST or None, instance=event_to_edit.location)
list_of_event_scheds = EventSchedule.objects.filter(pk=event_id).values()
event_sched_formset = EventScheduleModelFormSet(request.POST or None, initial=list_of_event_scheds)
if event_form and location_form and event_sched_formset:
if event_form.is_valid() and location_form.is_valid() and event_sched_formset.is_valid():
# update event
mapDataManager.updateEvent(event_form, location_form, event_sched_formset)
# redirect
return HttpResponseRedirect(reverse('map'))
else:
# set feedback to show edit event form
feedback = "edit_event"
updateEvent()
有人能帮我吗?我是不是错过了一些基本的东西
编辑:只是澄清一下,我的表格没有更新,都是插入的。根据Daniel的建议,我认为我需要使用表单集来链接正在编辑的所有三个模型表单 您正在尝试保存EventScheduleModelFormSet表单?没有实例集,只有初始数据,所以每次都要创建一个新对象。还是我遗漏了什么?出于某种奇怪的原因,您正确地将
实例
传递给了主窗体,但将初始
传递给了EventScheduleModelFormSet,这是问题的直接原因
但是,由于这些模型显然具有外键关系,因此听起来您应该使用内联模型表单集:
from django.forms.models import inlineformset_factory
eventschedule_formset_class = inlineformset_factory(Event, EventSchedule)
event_sched_formset = eventschedule_formset_class(request.POST or None,
instance=event_to_edit)
现在无需使用
updateEvent
逻辑-您只需保存event\u sched\u formset
,它将正确引用事件。在这篇博文的帮助下,我能够按照Daniel的建议使内联模型表单集工作:
仅供参考,我遗漏的一个关键点是表单集的实例引用父模型。另外,如果要在模板中手动显示表单集,请不要忘记包含{{formset.id}。啊,我明白了。然后,我将开始为event_sched使用一个inlineformset。但是为什么要创建一个新的活动和一个新的地点呢?这些不是表单集,只是模型表单。由于这三个表单是通过外键关联的,我是否需要对所有内容都使用InLineFormSet?非常感谢!你在问题中没有明确说明情况就是这样。无论如何,您是否确定
request.POST['event\u id']
存在且不为空?是的,event\u id
正在正确传递,并且event\u form
同时具有新表单数据和实例对象。我试图使用您的代码,但我的内联表单集类不接受实例,正在抛出此错误\uuuu init\uuuuuu()在event\u sched\u formset=EventScheduleModelFormSet(instance=event\u form)
处得到一个意外的关键字参数'instance'
。我将很快失去对代码的访问权,直到周日,所以我可能不得不在以后跟进。然而,内联表单集似乎很有希望。我甚至不能更新事件或位置。没有任何东西得到更新,甚至连模型表单都没有。
from django.forms.models import inlineformset_factory
eventschedule_formset_class = inlineformset_factory(Event, EventSchedule)
event_sched_formset = eventschedule_formset_class(request.POST or None,
instance=event_to_edit)