11

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) 
+1

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. –

+0

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? –

+0

nieważne, znalazłem doktora –

Odpowiedz

6

Podstawowym problemem jest to, że gdy główne obiekty post_save sygnał jest wysyłany, gdy inlines nie zostały jeszcze zapisane: the model macierzysty zawsze zostaje zapisany jako pierwszy. Więc nie chodzi o to, że wysyła stare dane; w rzeczywistości jest to obecny stan danych.

Najprostszym rozwiązaniem jest utworzenie niestandardowego sygnału i wysłanie go w miejscu, w którym zapisano inlines. Metoda save_formset na ModelAdmin to twój hak.

+0

Chyba że jest coś, czego nie rozumiem w twojej odpowiedzi, to nie działa. Możesz zobaczyć w poście na blogu wszystkie metody, które wypróbowałem, na przykład za pomocą save_formset: http://haineault.com/blog/141/ –

+0

@ h3 Czy masz pomysł? Minęło dużo czasu, ale możesz to sprawdzić [post] (http: // stackoverflow.com/questions/14858559/save-the-related-objects-before-the-actual-object-being -edited-on-django-admin) i jego rozwiązania ilustrujące użycie [save_formset] (https: // docs. djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_formset). Zostawiłem komentarz na wypadek, gdyby ktoś wpadł na ten wpis – raratiru

Powiązane problemy