Сохранение формы Django с сигналом post_save, вызывающим конфликт

У меня есть модель Physical_therapy_order и модель Event (событие имеет внешний ключ для Physical_therapy_order). У меня есть представление, которое позволяет пользователю создавать новое событие. Также есть форма с 3 полями из модели Physical_therapy_order.

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, то при сохранении формы событий не должен ли сигнал использовать обновленный физический_терапевтический_порядок? Я даже не уверен, что я на правильном пути?


person rsp    schedule 29.11.2012    source источник


Ответы (1)


Я думаю, это из-за кешированных объектов.

Я бы предложил

  • Сначала сохраните eventform
  • Получите новый экземпляр pt_order, либо запросив базу данных, либо через сохраненный экземпляр формы события.
  • Затем заново создайте форму и сохраните.

Пример изменения кода:

# 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()
person Rohan    schedule 29.11.2012
comment
спасибо, сработало. 2 балла: я до сих пор не понимаю, почему сохранение моей исходной ptform не работает: я думал, что при сохранении формы сохраняются только ее поля, так что даже если у нее есть кешированный Physical_therapy_order, какое это имеет значение. Кроме того, к вашему сведению, я попробовал метод, аналогичный вашему, где я использовал Physical_therapy_order.get(pk=pt_pk), а затем попытался перезагрузить форму и сохранить ее: это не сработало. Но ваш метод получения заказа PT из eventform.save() работал хорошо. - person rsp; 30.11.2012
comment
@rsp, проблема в том, что атрибуты объекта устарели, так как новые атрибуты сохраняются в БД. Я считаю, что Physical_therapy_order.get(pk=pt_pk) также должен работать. Вы сделали это после сохранения eventform? - person Rohan; 30.11.2012