2

我有一个 Physical_therapy_order 模型和一个 Event 模型(一个事件具有 Physical_therapy_order 的外键)。我有一个允许用户创建新事件的视图。它还有一个包含来自 Physical_therapy_order 模型的 3 个字段的表单。

def PTEventCreateView(request, pt_pk):
    #get the pt order and create an a form for that order
    pt_order = get_object_or_404(Physical_therapy_order, pk=pt_pk)
    ptform = PT_schedule_form(instance=pt_order)

    if request.POST:
        eventform = PTEventForm(data=request.POST)
        ptform = PT_schedule_form(data=request.POST, instance=pt_order)

        if eventform.is_valid() and ptform.is_valid():
            #I do some checks here that compare data across the two forms.
            # if everything looks good i mark keep_saving=True so I can 
            # continue to save all the data provided in the two forms
            if keep_saving:
                ptform.save()
                eventform.save()
            #...send user to succss page

这工作得很好,除了:我的 PTEvent 模型有一个附加到它的 post_save 信号的函数。此函数拉取事件的相关 pt_order 并对其进行一些修改。现在,如果我先保存事件表单,那么信号的变化就不会发生。如果我先保存 ptform,则 ptform 更改将被丢弃,并且信号的更改会发生。

这很重要:ptform 正在编辑三个与 post_save 信号完全不同的字段。所以它不像他们正在修改相同的数据,只是相同的模型实例。我认为表单仅将字段保存在其 meta.fields 属性中。为什么会发生这种情况?另外,如果我先保存 ptform,那么当保存 eventsform 时,信号不应该使用更新的物理治疗顺序吗?我不确定我是否走在正确的轨道上?

4

1 回答 1

0

我认为这是因为缓存对象。

我建议的是

  • eventform先保存
  • 获取pt_order查询数据库的新实例或通过保存的 eventform 实例
  • 然后重新创建表单并保存。

示例代码更改:

# your code
if keep_saving:
    evt = eventform.save()
    # I'm not sure exact name of your field name for pt_order in Event model, change appropriately
    newptform = PT_schedule_form(data=request.POST, instance= evt.pt_order)
    newpt = newptform.save()
于 2012-11-29T04:40:59.990 回答