11

Si consideri il seguente:django segnale post_save manda formsets linea obsoleti

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(...) 

Ora voglio inviare una e-mail con i dettagli OrderForm ogni volta che qualcuno crea una o modificare uno.

Nessuna scienza missilistica finora .. usiamo solo un segnale post_save;

post_save.connect(email_notify, sender=OrderForm) 

Ma c'è un piccolo problema, l'oggetto OrderForm passato a email_notify viene aggiornato con i nuovi dati come previsto, ma non le voci OrderFormLine correlate.

Ho provato a sovrascrivere i metodi di salvataggio nell'amministratore AND E nel modello, ho provato a salvare l'oggetto, il modulo e la sua relazione prima di passarlo al mio gestore di notifica, non funziona nulla.

Sono consapevole che potrei collegare il segnale post_save al modello OrderItem, ma poi l'email sarebbe stata inviata per ogni articolo.

Aiuto Sono sull'orlo della pazzia.

UPDATE:

Found a simple and reliable solution

Breve storia:

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

È necessario salvare il modulo d'ordine per avere un numero identificativo valido da associare agli elementi pubblicitari. Mi sembra che un segnale personalizzato sia in ordine; questo potrebbe salvarti dalla tua follia. A volte, i casi speciali non sono malvagi, e questo è un caso speciale molto piccolo. "OrderForm" segnala quando è completamente istanziato, e il listener lo attende invece di post_save. –

+0

Non ho mai sentito parlare di segnali personalizzati .. e non riesco a trovare molto su questo argomento. Da quello che capisco, i segnali sono strettamente accoppiati nel django e non esiste alcun meccanismo per fornire segnali personalizzati. È documentato? –

+0

non importa, ho trovato il documento –

risposta

6

Il problema di fondo è che quando gli oggetti principali post_save segnale viene inviato, i inline non sono stati ancora salvato: la il modello genitore viene sempre salvato per primo. Quindi, non è che invii vecchi dati; in effetti è lo stato attuale dei dati.

La soluzione più semplice è creare un segnale personalizzato e inviare quel segnale in un punto in cui sono stati salvati i dati in linea. Il metodo save_formset su ModelAdmin è il tuo hook.

+0

A meno che non ci sia qualcosa che non capisco sulla tua risposta, non funziona. Puoi vedere nel post del blog tutti i metodi che ho provato, includendo save_formset: http://haineault.com/blog/141/ –

+0

@ h3 Hai avuto l'idea? È passato molto tempo ma puoi controllare questo [post] (http: // StackOverflow.it/questions/14858559/save-the-related-objects-before-the-actual-object-being-edited-on-django-admin) e le sue soluzioni che illustrano l'uso di [save_formset] (https: // docs. djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_formset). Ho lasciato il commento nel caso qualcuno si imbatta in questo post – raratiru