如何更新Django modelform而不插入?

如何更新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

我的Django代码在插入新行而不是更新现有行时遇到问题。这里的许多人都曾就类似的问题寻求过帮助,但通常他们忘记了设置
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)