Rozważmy następujący:Django wysyła sygnał post_save nieaktualne formsets inline
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(...)
Teraz chcę wysłać e-mail ze szczegółami Sposób zamawiania gdy ktoś tworzy jedną lub zmodyfikować jeden.
Jak dotąd żadna nauka o rakietach. Użyjmy tylko sygnału post_save;
post_save.connect(email_notify, sender=OrderForm)
ale jest jeden mały problem przedmiotem Zlecenia Reklamowego przekazane email_notify jest aktualizowana o nowe dane zgodnie z oczekiwaniami, ale nie związane z nimi przedmioty OrderFormLine.
Próbowałem zastąpić metody składowania w admin I w modelu, Próbowałem zapisać obiekt, formularz i jego relacji przed przekazaniem go do mojej obsługi powiadomień, nic nie działa.
Jestem świadomy, że mogę dołączyć sygnał post_save do modelu OrderItem, ale wtedy wiadomość e-mail zostanie wysłana dla każdego elementu.
Pomoc Jestem na krawędzi szaleństwa.
UPDATE:
Found a simple and reliable solution
Krótka historia:
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)
Musisz zapisać formularz zamówienia, aby mieć ważny numer identyfikacyjny, który zostanie powiązany z Twoimi elementami zamówienia. Wydaje mi się, że niestandardowy sygnał jest w porządku; to może uratować cię od twojego szaleństwa. Czasami przypadki specjalne nie są złe, a to jest bardzo mały przypadek specjalny. "OrderForm" sygnalizuje, kiedy jest w pełni utworzony, a twój słuchacz czeka na to zamiast post_save. –
Nigdy nie słyszałem o pisaniu niestandardowych sygnałów ... i nie mogę znaleźć zbyt wiele na ten temat. Z tego, co rozumiem, sygnały są ściśle sprzężone w django i nie ma mechanizmu zapewniającego niestandardowe sygnały. Czy jest to udokumentowane? –
nieważne, znalazłem doktora –