Подтвердить что ты не робот

Сигнал django post_save отправляет устаревшие встроенные формы

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

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.

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

Я знаю, что я мог бы присоединить сигнал 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)
4b9b3361

Ответ 1

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

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