Django使用post_save信号保存,导致冲突

时间:2012-11-29 03:06:57

标签: django django-models django-forms django-signals

我有一个Physical_therapy_order模型和一个事件模型(一个事件具有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

这只是FINE EXCEPT:我的PTEvent模型的post_save信号附加了一个函数。此函数拉取事件的相关pt_order并对其进行一些修改。现在,如果我首先保存事件形式,那么信号的变化就不会发生。如果我首先保存ptform,那么ptform更改将被丢弃并且信号发生变化。

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

1 个答案:

答案 0 :(得分: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()