сигнал django post_save отправляет устаревшие встроенные формы - PullRequest
11 голосов
/ 06 ноября 2010

Рассмотрим следующее:

class OrderForm(models.Model):
    title = models.CharField(max_length=100)
    desc  = models.TextField()


class OrderFormLine(models.Model):
    order = models.ForeignKey(OrderForm)
    lagel = models.CharField(max_length=100)
    qty   = models.IntegerField(...)
    price = models.FloatField(...)

Теперь я хочу отправить электронное письмо с деталями формы заказа всякий раз, когда кто-то его создает или изменяет.

Пока нет науки о ракетах ...используйте сигнал post_save;

post_save.connect(email_notify, sender=OrderForm)

Но есть одна маленькая проблема: объект OrderForm, переданный в email_notify, обновляется, как и ожидалось, новыми данными, но не связанными элементами OrderFormLine.

Я пытался переопределить методы сохранения в администраторе И в модели, я пытался сохранить объект, форму и ее отношение, прежде чем передать его в мой обработчик уведомлений, ничего не работает.

Я знаю, что мог бы прикрепить сигнал post_save к модели OrderItem, но тогда электронное письмо будет отправлено для каждого элемента.

Помогите Я на грани безумия.

ОБНОВЛЕНИЕ :

Нашли простое и надежное решение

Краткая история:

def email_notify_orderform(sender, **kwargs):
    instance = kwargs['instance']
    ct = ContentType.objects.get_for_model(OrderForm)
    if ct.id == instance.content_type.id:
        print instance.is_addition()
        print instance.is_change()
        print instance.is_deletion()
        print instance.change_message
        print instance.action_time
        print instance.get_edited_object().total() # BINGO !
post_save.connect(email_notify_orderform, sender=LogEntry)

1 Ответ

6 голосов
/ 12 мая 2011

Основная проблема заключается в том, что при отправке сигнала основных объектов post_save строки еще не сохранены: родительская модель всегда сохраняется первой.Итак, дело не в том, что он отправляет старые данные;на самом деле это текущее состояние данных.

Самое простое решение - создать собственный сигнал и отправить этот сигнал в место, где были сохранены строки.Метод save_formset на ModelAdmin - ваш хук.

...